7

哪种创建字符串的方式在运行时效率更高C#

1号:

bool value = true;
int channel = 1;
String s = String.Format(":Channel{0}:Display {1}", channel, value ? "ON" : "OFF");

2号:

bool value = true;
String channel = "1";
string  s = ":Channel" + channel + ":Display " + value ? "ON" : "OFF";
4

4 回答 4

7

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

bool value = true;
int channel = 1;
String s = String.Format(":Channel{0}:Display {1}", channel,
    value ? "ON" : "OFF");

最后一行编译为:

String s = String.Format(":Channel{0}:Display {1}",
    new object[2] {(object)channel, value ? "ON" : "OFF")};

有趣的是,创建了一个数组和一个“盒子” ,当然还有查找/int channel所需的额外解析。{0}{1}

现在2号:

bool value = true;
String channel = "1";
string  s = ":Channel" + channel + ":Display " + (value ? "ON" : "OFF");

最后一行编译为:

string s = string.Concat(":Channel", channel, ":Display ", value ? "ON" : "OFF");

这里没有数组,没有盒子(channel现在是一个字符串),也没有解析。过载是public static string string.Concat(string,string,string,string); string.Concat非常有效地实现,预先分配一个正确大小的字符串然后覆盖,等等。

在大多数代码中,两者都可以。第二个版本在技术上更有效(没有盒子,没有数组,没有解析),但是如果你以后想国际化,那就是一个主要的痛苦。在大多数应用程序中,您不会注意到两者之间有任何区别。解析速度很快,并且盒子/数组作为 gen-zero 对象被廉价地收集。但便宜不是免费的。

于 2013-03-10T22:03:57.840 回答
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();

我的结果是:

数字 1:136 毫秒

数字 2:91 毫秒

所以第二个选项有更好的性能。第一个选项使用额外的方法调用 ( string.Format()) 和替换参数(正如 Marc 所说)的事实是不同的。

如果我不使用 100.000 次迭代,而是使用 1.000.000,这就是我得到的

1号:1308ms

2号:923ms

基本上,同样的结论。

于 2013-03-10T21:43:15.337 回答
0

关于 Marc Gravell 的回答:您可以通过传递 channel.ToString() 来避免装箱操作。我已经根据经验验证了这对#1 和#2 都有轻微的性能改进。

  • 在案例 #1 中,您避免了装箱操作。
  • 在情况 #2 中,您避免调用隐式转换运算符。

但是在试图反驳你的理论之后,(使用更长的连接和随机字符串)我必须承认 #2 比 #1 快。

于 2014-05-28T14:18:55.377 回答
-4

1号是最有效的。

String.Format() 函数在内部使用 System.Text.StringBuilder 类型来连接字符串。

StringBuilder 用于表示可变(又名可编辑)字符串,它是连接字符串的最有效方式。http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

于 2013-03-10T21:47:36.430 回答