Raz*_*zer 7 c# string performance
哪种创建字符串的方式在运行时效率更高 C#
1号:
bool value = true;
int channel = 1;
String s = String.Format(":Channel{0}:Display {1}", channel, value ? "ON" : "OFF");
Run Code Online (Sandbox Code Playgroud)
2号:
bool value = true;
String channel = "1";
string s = ":Channel" + channel + ":Display " + value ? "ON" : "OFF";
Run Code Online (Sandbox Code Playgroud)
我现在要添加一个例子来说明编译器如何对待这两个,因为在其他一些答案中似乎存在很多混淆(编辑:请注意,这些混淆中的大部分现在已被删除/编辑掉) :
bool value = true;
int channel = 1;
String s = String.Format(":Channel{0}:Display {1}", channel,
value ? "ON" : "OFF");
Run Code Online (Sandbox Code Playgroud)
最后一行编译为:
String s = String.Format(":Channel{0}:Display {1}",
new object[2] {(object)channel, value ? "ON" : "OFF")};
Run Code Online (Sandbox Code Playgroud)
有趣的是,创建一个数组和一个"盒子" int channel,当然还有查找{0}/ 所需的额外解析{1}.
现在2号:
bool value = true;
String channel = "1";
string s = ":Channel" + channel + ":Display " + (value ? "ON" : "OFF");
Run Code Online (Sandbox Code Playgroud)
最后一行编译为:
string s = string.Concat(":Channel", channel, ":Display ", value ? "ON" : "OFF");
Run Code Online (Sandbox Code Playgroud)
这里没有数组,没有框(channel现在是一个字符串),没有解析.过载是public static string string.Concat(string,string,string,string); string.Concat非常有效地实现,预先分配正确大小的字符串然后重写,等等.
在大多数代码中,要么是好的.第二个版本在技术上更有效(没有盒子,没有数组,没有解析),但如果你想稍后进行国际化,这是一个很大的痛苦.在大多数应用程序中,您不会注意到两者之间的任何差异.解析速度很快,并且盒子/数组被廉价地收集为gen-zero对象.但便宜不是免费的.
这可以帮助您自己测试.这是使用.net v4.0.30319运行时执行的.
sw = new System.Diagnostics.Stopwatch();
// Number 1
bool value = true;
int channel = 1;
sw.Start();
for (int i = 0; i <= 100000; i++)
{
String s = String.Format(":Channel{0}:Display {1}", channel, value ? "ON" : "OFF");
}
sw.Stop();
sw.Reset();
// Number 2
sw.Start();
for (int i = 0; i <= 100000; i++)
{
string s = "Channel" + channel + ":Display " + (value ? "ON" : "OFF");
}
sw.Stop();
Run Code Online (Sandbox Code Playgroud)
我的结果是:
1号:136毫秒
2号:91毫秒
所以第二种选择有更好的表现.事实上,第一个选项使用额外的方法call(string.Format())和替换参数(如Marc所说)是产生差异的原因.
如果不使用100.000次迭代,我使用1.000.000,这就是我得到的
1号:1308毫秒
2号:923毫秒
基本上,同样的结论.