在这个上下文String.Format或String.Replace会更快?

时间:2010-09-30 17:09:30

标签: c# string string-formatting stringbuilder

string str = 'my {0} long string {1} need formatting';

我应该做以下事吗,

str = string.Format(str, "really", "doesn't");

或创建类似的方法并调用str = str.ReplaceWithValues("really", "doesn't");

 public string ReplaceWithValues(this string str, params object[] values) {
    string ret = str;
    for (int i = 0; i < values.Length; i++) {
        ret = str.Replace(string.Concat("{", i, "}"), values.ToString());
    }
    return ret;
}

看起来像StringBuilder.AppendFormat()在执行像这样的简单替换时效率不高,因为它通过字符串逐字逐句。

4 个答案:

答案 0 :(得分:15)

为什么要重新发明String.Format?

我只是使用框架方法 - 它完全符合你的要求,是健壮的,并且对那些跟随的人有意义......


只是为了满足你的好奇心:

  

看起来像StringBuilder.AppendFormat()在执行像这样的简单替换时效率不高,因为它通过字符串逐字逐句。

String.Format,FYI,在内部使用StringBuilder.AppendFormat。话虽如此,StringBuilder.AppendFormat非常有效。你提到它通过字符串“逐字符” - 但是,在你的情况下,你正在使用多次调用Replace和Concat。使用StringBuilder单次传递字符串可能要快得多。如果您真的需要知道 - 您可以对此进行分析以进行检查。在我的机器上,如果我同时运行以上1,000,000次,我会得到以下时间:

String.Format -  1029464 ticks
Custom method -  2988568 ticks

答案 1 :(得分:2)

自定义过程将增加每个额外占位符的成本,并为每个中间调用Replace生成垃圾收集器的一次性字符串。

除了string.FormatReplace的多次调用快得多的可能性之外,string.Format还包括对文化敏感操作的重载。

string.Format的灵活性和直观性至少与速度一样引人注目。

答案 2 :(得分:1)

如果您只想连接一些字符串,为什么不这样做呢?

string result = "my " + x + " long string " + y + " need formatting";

string result = string.Concat("my ", x, " long string ", y, " need formatting");

答案 3 :(得分:0)

在C#中,+运算符实际上是一个string.Concat(),我一直认为String.Format("Hello: {0} {1}", "Bob", "Jones")是最快的。事实证明,在调试器外部调试样本后,在发布模式下,"Bob" + "Jones"更快。但是有一个截止点。我相信大约8个串联左右,string.Format变得更快。