1

我在 C# 应用程序中遇到了性能问题。问题是一个很长的字符串 - base64 编码,但不普通。偶数字符必须上移 5 个字符,奇数字符下移 5 个字符,以创建可读的 base64 字符串。这是我的代码:

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

使用 aStringBuilder而不是字符串:

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 回答