我在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秒。我应该采取哪些措施来提高效率?
答案 0 :(得分: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
会在缓冲区中添加一个字符,并根据需要自动扩展缓冲区。虽然在这种情况下它根本没有扩展,因为我预先将它分配到所需的长度。