创建串联字符串的性能

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)

Mar*_*ell 7

我现在要添加一个例子来说明编译器如何对待这两个,因为在其他一些答案中似乎存在很多混淆(编辑:请注意,这些混淆中的大部分现在已被删除/编辑掉) :

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对象.但便宜不是免费的.


Cla*_*edi 6

这可以帮助您自己测试.这是使用.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毫秒

基本上,同样的结论.