String Concat使用常量 - 性能

时间:2011-03-02 07:08:57

标签: c# performance memory string stringbuilder

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

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

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

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)在性能和/或内存方面更好?

2 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:1)

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

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

const string A = "Hello ";
const string B = "World";

...
string test = A + B;

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

string test = "Hello " + "World";

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

string test = "Hello World";

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