String Concat使用常量 – 性能

假设我有以下字符串常量:

const string constString1 = "Const String 1"; const string constString2 = "Const String 2"; const string constString3 = "Const String 3"; const string constString4 = "Const String 4"; 

现在我可以用两种方式追加字符串:Option1:

 string resultString = constString1 + constString2 + constString3 + constString4; 

选项2:

 string resultString = string.Format("{0}{1}{2}{3}",constString1,constString2,constString3,constString4); 

内部string.Format使用StringBuilder.AppendFormat。 现在假设我附加了常量字符串,哪个选项(option1或选项2)在性能和/或内存方面更好?

第一个将由编译器(至少是Microsoft C#编译器)完成(与编译器执行1 + 2的方式相同),第二个必须在运行时完成。 显然第一个更快。

作为一个额外的好处,在第一个字符串是内部化的,在第二个字符串中它不是。

而且String.Format很慢:-)(请阅读http://msmvps.com/blogs/jon_skeet/archive/2008/10/06/formatting-strings.aspx )。 不要“慢到成为一个问题”,除非您的所有程序一整天都是格式字符串(数百万个,而不是TENS)。 然后你可以更快地Append它们AppendStringBuilder

第一个变体是最好的,但只有当你使用常量字符串时。

这里有两个编译器优化(来自C#编译器,而不是JIT编译器)。 让我们举一个程序的例子

 const string A = "Hello "; const string B = "World"; ... string test = A + B; 

第一个优化是常量传播,它会将您的代码基本上改为:

 string test = "Hello " + "World"; 

然后,文字字符串的串联(因为它们现在,由于第一次优化)优化将启动并将其更改为

 string test = "Hello World"; 

因此,如果您编写上面显示的程序的任何变体,由于C#编译器进行了优化,实际的IL将是相同的(或至少非常相似)。