【发布时间】:2010-07-02 08:53:17
【问题描述】:
下面是我正在使用的代码
private void TestFunction()
{
foreach (MySampleClass c in dictSampleClass)
{
String sText = c.VAR1 + c.VAR2 + c.VAR3
PerformSomeTask(sText,c.VAR4);
}
}
我的朋友建议更改为(以提高性能。dictSampleClass 是一个字典。它有 10K 个对象)
private void TestFunction()
{
String sText="";
foreach (MySampleClass c in dictSampleClass)
{
sText = c.VAR1 + c.VAR2 + c.VAR3
PerformSomeTask(sText,c.VAR4);
}
}
我的问题是,“上述更改是否会提高性能?如果是,如何?”
哇,这超出了预期的响应。大多数人说“C# 编译器会处理这个问题”。那么c编译器呢??
【问题讨论】:
-
如果这能提高性能,我会感到非常惊讶。但这会损害可读性。
-
有一个(可忽略不计的)性能 HIT,因为您分配空字符串只是为了立即在 foreach 内重新分配。
-
您可以避免将 sText 设置为空,因为它在每次迭代时都会被初始化。正如其他人所说,编译器将生成相同的代码,但我发现在循环外声明变量更简洁。也就是说,请注意以这种方式连接 3 个字符串,产生的字符串比预期的多 2 个(tmp1=c.Var1+c.Var2 和 tmp2=tmp1+c.Var3),所以它可能是值得的(为了尽可能少地使用内存根据需要)使用一个大小预先初始化为 (c.VAR1.Length+c.VAR2.Length+c.VAR3.Length) 的 StringBuilder。
-
您可以自己回答这个问题。 两种方法都试一下,看看性能是否不同。如果你不能区分,那么性能没有不同。更好的性能的全部意义在于它明显更好。
标签: c#