c# - Foreach 循环 - 长字符串的性能

标签 c# performance foreach base64

我的 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 秒。我应该采取什么步骤来提高效率?

最佳答案

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

关于c# - Foreach 循环 - 长字符串的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16554528/

相关文章:

javascript - ASPX URL 产生一个 JSON 字符串,使用 jQuery DataTable 使用

iphone - UITableView使用CALayer + mask的滚动性能

php - 在 PHP foreach 循环中使用 jQuery 函数

php - Laravel 5.6 试图获取非对象的属性

c# - 你如何限制从 c# dll 导出的内容?

c# - 使用 Automapper 将字符串映射到 List<string>,反之亦然

c# - 如何在 xamarin ios 中将 NSArray 转换为 List<String>

java - 是否有解决 Java 在遍历大型目录时性能不佳的方法?

Java Disruptor 模式和低延迟

c# - MVC 中 javascript 中的嵌套 foreach