2

画像をテキストRRR GGG BBB 文字列配列に変換するアプリを作成しています。

小さな画像では非常に高速に動作しますが、入力画像のピクセル数が非常に多い場合、アプリの速度は徐々に低下します。

アプリケーションはx,y、入力画像のすべてのピクセルに対してループを実行し、各ピクセルをスキャンして、その RGB 形式の値を最終的な文字列に追加します。この文字列は、画像全体がスキャンされた後にテキストとして保存されます。

System.String.Concat(string,string)組み込みのプロファイラーの助けを借りて、最終的な文字列が大きくなるほど時間がかかることがわかりました。

次に、1行の計算結果を保存し、次の行に入る前にそれを最終的な文字列に追加する一時的な文字列を作成しようとしました。現在は約 10 倍速く動作しますが、それでも終盤に近づくとパフォーマンスが低下します。

しかし、最終的には、すべてのテスト画像が実際の画像よりも小さくなります。さらに大きな画像でも連結速度を高く保つにはどうすればよいですか?

4

6 に答える 6

8

System.Text.StringBuilderを使用します。

var sb = new StringBuilder();
sb.Append(r);
sb.Append(g);
sb.Append(b);

string result = sb.ToString();

このクラスは、特に高速な文字列連結用に設計されています。私はそれよりも速いものは何も知りません(一般的な場合)。

于 2012-04-23T12:02:00.680 に答える
4

@abatishchevの答えを詳しく説明するには:

文字列を連結すると、実際には連結ごとに新しい文字列インスタンスが作成されるため、常に数千(数百万?)の小さな文字列が割り当てられます。ただし、StringBuilderは、内部文字バッファを使用して、構築時に文字列を管理し、これらの頻繁な割り当てを回避します。

使用法は次のようになります。

StringBuilder sb = new StringBuilder();
foreach (Pixel pixel in myPixels)
{
    sb.Append(ConvertToString(pixel));
}

string myString = sb.ToString();
于 2012-04-23T12:05:16.257 に答える
3

誰もが言ったように、はい、StringBuilderを使用してください。

しかし

コレクションの形で連結する文字列がすでにある場合は、より高速でString.Join()あることが証明されています。

ただ注意してください。

于 2012-04-23T12:11:48.407 に答える
2

使用するString.Join("", myarray);

于 2012-04-23T12:03:14.513 に答える
0

次のようにStringBuilderを使用します。

//add reference
using System.Text

//create string builder
StringBuilder sb = new StringBuilder();
//add items to it
sb.Append("some text");
sb.Append(" more text");
于 2012-04-23T12:05:57.277 に答える
0

巨大で複雑な文字列を操作するように設計された StringBuilder。

于 2012-04-23T12:38:45.467 に答える