Foreach循环-长字符串的性能

本文关键字:性能 字符串 循环 Foreach | 更新日期: 2023-09-27 18:13:29

我正面临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秒。我应该采取哪些步骤来提高效率呢?

Foreach循环-长字符串的性能

使用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会向缓冲区添加一个字符,缓冲区会根据需要自动扩展。尽管在本例中它根本没有展开,因为我预先为它分配了所需的长度。