代码之家  ›  专栏  ›  技术社区  ›  MandoMando

使用arraylist进行多字符串连接是否更快?

  •  2
  • MandoMando  · 技术社区  · 15 年前

    我正在使用.NET Micro Framework,因此StringBuilder不可用。

    我见过apt专业人员的一些代码使用字符数组来连接和构建字符串,而不是+运算符。它们基本上构建一个托管代码StringBuilder。

    这有性能优势吗?假设连接数大于10,字符串长度也大于10。

    2 回复  |  直到 15 年前
        1
  •  11
  •   Jon Skeet    15 年前

    不,不要使用 ArrayList 属于 char 价值观。这将使每个字符的性能都变得糟糕,内存的使用也是如此。(引用大小+每个字符的装箱字符大小…哎呀!)

    使用A char[] 在需要的时候,在内部“调整”它(创建一个新数组并复制其中的内容),也许每次都会增加一倍的大小。(编辑:你不需要把它调整到你需要的大小-你可以从16个字符开始,然后继续翻倍-所以大多数 Append 操作 不要 需要“调整”数组的大小。)

    这和 StringBuilder 不管怎样。(甚至更接近Java的 字符串拼接 作品。)

    我建议你建立自己的 字符串拼接 键入最重要的成员。单元测试检查,并在适当的情况下进行配置。

    如果你想要一个简短的例子,请告诉我。

        2
  •  1
  •   Guffa    15 年前

    使用一个字符数组列表来构建一个字符串被认为是有性能的唯一原因是,如果将它与一些性能非常差的字符串进行比较。使用+=连接一个巨大的字符串就是一个性能如此糟糕的例子。

    如果只将字符串连接成几个较短的字符串而不是一个较大的字符串,则可以提高字符串连接的效率。

    例如,此代码:

    string[] parts = new string[1000];
    for (int i = 0; i < parts.Length; i++) {
      string part = String.Empty;
      for (int j=0; j < 100; j++) {
        part += "*";
      }
      parts[i] = part;
    }
    string result = String.Concat(parts);
    

    比此代码快450倍:

    string result = string.Empty;
    for (int i = 0; i < 100000; i++) {
      result += "*";
    }
    

    一个StringBuilder仍然更快,但是它比第一个示例快四倍。因此,通过使用较短的字符串,您可以将时间缩短99.78%,而使用StringBuilder只会再缩短0.16%。