【问题标题】:What string concatenation method to use for N number of iterations?N 次迭代使用什么字符串连接方法?
【发布时间】:2009-10-12 06:31:14
【问题描述】:

如果我想将一个字符串连接N次,我应该选择哪种方法?

以这段代码为例:

public static string Repeat(this string instance, int times)
{
        var result = string.Empty;

        for (int i = 0; i < times; i++)
            result += instance;

        return result;
}

可以在“times”设置为 5 或 5000 的情况下调用此方法。我应该更喜欢使用哪种方法?

字符串。加入?字符串生成器?只是标准的 string.Concat?

类似的功能将在商业库中实现,所以我真的需要“最佳”方式来做到这一点。

【问题讨论】:

    标签: c# string-concatenation


    【解决方案1】:
        public static string Repeat(this string instance, int times)
        {
            if (times == 1 || string.IsNullOrEmpty(instance)) return instance;
            if (times == 0) return "";
            if (times < 0) throw new ArgumentOutOfRangeException("times");
            StringBuilder sb = new StringBuilder(instance.Length * times);
            for (int i = 0; i < times; i++)
                sb.Append(instance);
            return sb.ToString();
        }
    

    【讨论】:

    【解决方案2】:

    当然是字符串生成器。它适用于快速字符串连接操作,因为它不会在您每次想要连接字符串时创建新对象。

    详情见here

    【讨论】:

      【解决方案3】:

      字符串生成器。

      "结果 += 结果;"

      每次执行赋值时都会创建一个新字符串,并将该新字符串分配给您的变量,因为字符串是不可变的。

      一定要使用 StringBuilder。

      【讨论】:

        【解决方案4】:

        永远不要假设一种方法比另一种更快——您必须始终衡量两种方法的性能,然后再做出决定。

        令人惊讶的是,对于较少的迭代次数,仅使用标准字符串连接(结果 += 字符串)通常比使用字符串生成器更快。

        如果您知道迭代次数始终相同(例如,始终为 50 次迭代),那么我建议您使用不同的方法进行一些性能测量。

        如果您真的想要变得聪明,请根据迭代次数进行性能测量,您可以找到一种方法比另一种方法更快的“交叉点”,并将该阈值硬编码到方法中:

        if(iterations < 30)
        {
            CopyWithConcatenation();
        }
        else
        {
            CopyWithStringBuilder();
        }
        

        确切的性能交叉点取决于您的代码的具体细节,如果不进行性能测量,您将永远无法找出它们是什么。

        更复杂一点的是,StringBuilder 对字符串连接(创建更多临时实例)进行了“更整洁”的内存管理,因此这也可能对字符串循环之外的整体性能产生影响(比如下一次垃圾收集器运行)。

        让我们知道你的进展。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-25
          • 2013-01-26
          • 2018-07-25
          • 2011-10-11
          • 2017-06-25
          • 1970-01-01
          • 1970-01-01
          • 2015-12-21
          相关资源
          最近更新 更多