当我选择将一个字符串或一个char添加到常量字符串时,我想知道是否存在性能影响.
所以我写了一个小型控制台应用程序:(.NET 4)
static class Program
{
const string STR = "string ";
static void Main()
{
var arr = new string[99999999];
Stopwatch timer = new Stopwatch();
Console.ReadLine();
timer.Start();
//for (uint i = 0; i < 99999999; i++)
//{
// arr[i] = STR + 'C';
//}
for (uint i = 0; i < 99999999; i++)
{
arr[i] = STR + "C";
}
timer.Stop();
Console.WriteLine(timer.ElapsedMilliseconds);
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
你必须评论一个for循环.
所以,STR + "C"需要大约1300毫秒.
因为STR + 'C'我还没有看到结果.这需要太长时间,似乎很难打扰我的电脑.
所以,我的问题是.这种性能影响如何可能?我知道在实际使用中不会经常出现99999999个值的数组,但它仍然是一个巨大的差异.
提前致谢!
这实际上很容易解释:你偶然发现C#编译器将对字符串表达式执行常量折叠这一事实.
由于您声明STR了const,它具有用文字字符串替换对它的引用的效果"string ".然后,当编译器遇到时"string " + "C",它用等效项替换该表达式"string C".所以实际完成的循环是花费所有时间将该字符串分配给数组中的不同位置.
相反,char串联没有以这种方式优化,因此您实际上必须等待连接(包括分配新string对象)以及数组赋值.同样,循环会产生大量的垃圾,所以你也在等待收集器.
如果你想公平地比较这两个操作,我会做两件事:
STR为static readonly而不是const.