1

C# アプリケーションでパフォーマンスの問題に直面しています。問題はかなり長い文字列です - base64 でコード化されていますが、普通ではありません。読み取り可能な base64 文字列を作成するには、偶数文字を 5 文字上に、奇数文字を 5 文字下に移動する必要があります。私のコードは次のとおりです。

string b64stock; // <- long one
int b = 0;
string b64readable = "";
foreach (char c in b64Stock)
        {
            if ((b % 2) == 0)
            {
                int asciichar = (int)c;
                asciichar += 5;
                b64readable += (char)asciichar;
            }
            else
            {
                int asciichar = (int)c;
                asciichar -= 5;
                b64readable += (char)asciichar;
            }
            b++;
        }

ストップウォッチでコードを確認しました。ループの実行には 17 秒かかります。これをより効率的にするには、どのような手順を踏む必要がありますか?

4

1 に答える 1

4

StringBuilder文字列ではなくを使用します。

string b64stock; // <- long one
int b = 0;
StringBuilder sb = new StringBuilder(b64Stock.Length);
foreach (char c in b64Stock)
{
    int asciiChar = (int)c;
    if ((b % 2) == 0)
    {
        asciichar += 5;
    }
    else
    {
        asciichar -= 5;
    }
    sb.Append((char)asciichar);
    b++;
}
string b64readable = sb.ToString();

発生しているパフォーマンスの問題は、文字列が不変であるためです。あなたが書くときmyString += 'x'、それは変更されませんmyString。むしろ、必要な長さの新しい文字列を作成し、古い文字列をmyStringそれにコピーします。これにより、比較的短い文字列でもパフォーマンスが低下します。

StringBuilder文字列が期待どおりに機能します。を呼び出すAppendと、バッファーに文字が追加され、必要に応じてバッファーが自動的に拡張されます。この場合、必要な長さに事前に割り当てているため、まったく拡張されていません。

于 2013-05-14T23:45:32.677 に答える