繁体   English   中英

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

[英]What would be faster in this context String.Format or String.Replace?

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()在执行像这样的简单替换时效率不高,因为它通过字符串逐个字符地进行。

你为什么要重新发明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

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

除了string.Format比多次调用Replace速度快得多之外, string.Format还包括对文化敏感操作的重载。

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

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

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

要么

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM