「巨大な」文字列の場合、すべてをメモリにロードせずに、ストリーミング アプローチを採用することが理にかなっている場合があります。最高の生のパフォーマンスを得るために、ポインター演算を使用して文字列の一部を検索およびキャプチャすることで、速度を少し下げることができる場合があります。
明確にするために、私は2つのまったく異なるアプローチを述べています。
1 - ストリーム
OP には、これらの文字列の大きさは示されていませんが、メモリにロードするのは実際的ではない場合があります。ファイル、DB に接続されたデータ リーダー、アクティブなネットワーク接続などから読み取られている可能性があります。
このシナリオでは、ストリームを開き、順方向に読み取りStringBuilder
、基準が満たされるまで入力をバッファリングします。
2 - 安全でない文字操作これには、完全な文字列が
必要です。文字列の先頭への char* を非常に簡単に取得できます。
// fix entire string in memory so that we can work w/ memory range safely
fixed( char* pStart = bigString )
{
char* pChar = pStart; // unfixed pointer to start of string
char* pEnd = pStart + bigString.Length;
}
各文字をインクリメントpChar
して調べることができるようになりました。選択したとおりにバッファリングするか (たとえば、隣接する複数の文字を調べたい場合)、またはバッファリングしないかを選択できます。メモリの終了位置を決定したら、操作できるデータの範囲ができました。
C# の安全でないコードとポインター
2.1 - より安全なアプローチ
アンセーフ コードに慣れている場合、それは非常に高速で、表現力があり、柔軟です。そうでない場合でも、同様のアプローチを使用しますが、ポインター演算は使用しません。これは、@supercat が提案したアプローチ、つまり次のアプローチに似ています。
- char[] を取得します。
- 1文字ずつ読んでください。
- 必要に応じてバッファします。
StringBuilder
これには適しています。初期サイズを設定し、インスタンスを再利用します。
- 必要に応じてバッファーを分析します。
- バッファを頻繁にダンプします。
- 目的の一致が含まれている場合は、バッファーで何かを行います。
また、安全でないコードに対する必須の免責事項:ほとんどの場合、フレームワーク メソッドの方が優れたソリューションです。それらは安全で、テスト済みで、毎秒何百万回も呼び出されます。安全でないコードは、すべての責任を開発者に負わせます。前提はありません。優れたフレームワーク/OS の市民になるかどうかはあなた次第です (たとえば、不変の文字列を上書きしない、バッファー オーバーランを許可しないなど)。仮定を行わず、セーフガードを削除するため、多くの場合、パフォーマンスが向上します。実際に利点があるかどうか、および利点が十分に大きいかどうかを判断するのは、開発者次第です。