[英]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.