私はこのコンストラクトがパフォーマンスクリティカルセクションの一部である高性能コードについて取り組んでいます。char []からの安全でない文字列の作成
string
が「スキャン」され、メタデータを効率的に格納されている:これは、いくつかのセクションに何が起こるかです。
- このメタデータに基づいて、メインストリングのチャンクは
char[][]
に分かれています。 char[][]
はstring[]
に転送する必要があります。
new string(char[])
を呼び出すことができますが、結果をコピーする必要があることがわかりました。
この余分なコピーを避けるには、文字列の内部バッファーに直接書き込むことが可能でなければならないと思います。これは安全でない操作でも(オーバーフロー、フォワード互換性のような意味合いが多いことがわかります)。
私はこれを達成するいくつかの方法を見てきましたが、私は本当に満足していません。
どのようにこれを達成するための真の提案を持っていますか?
追加情報:
実際のプロセスは、必ずしも、それは実質的に「マルチストリング」操作ですchar[]
への変換は含まれません。 3つのインデックスとその長さが追加されています。
StringBuilder
は、少数のコンカットに対してオーバーヘッドが多すぎます。
はEDIT:原因、それはまさに私が求めているということであるもののいくつかのあいまいな側面に
は、私はそれを定式てみましょう。
これは何が起こるかです:
- 主な文字列がインデックス化されます。
- メイン文字列の一部が
char[]
にコピーされます。 char[]
はstring
に変換されます。 私は何をしたいのですが、その結果、ステップ2と3をマージです
:
- 主な文字列がインデックス化されています。
- メインの文字列の一部が
string
にコピーされます(そして、GCはfixed
キーワードを適切に使用することによって処理中に手を離すことができます)。
そしてノートこれは外部のライブラリであり、そしてプロジェクトがそれに(後方互換性)に依存するので、私は、[]文字列から出力タイプを変更することはできませんということです。
この後、実際に文字列とは何をする必要がありますか?つまり、 'string []'への写像方法を見つけようとするのではなく、 'char []'として取り込み、 'int、int'の位置と長さのペアを格納することができます必要なときにいつでも部分配列を引き出すために元の配列を参照する必要があります。 –
ここでは、どのコードを改善しようとしているのか分かりません。 –
文字列クラスは特別です。それは定義上不変であり、コピーを伴う。これを回避しようとすると、GCや他のマネージコード(文字列がプールされている)に問題があるかどうかを尋ねています。 – Nikki9696