我在某处读到:
良好做法:exp += val
不良做法:exp = exp + val
第二个选项强制JIT评估exp
的两个副本,并且很多时候都不需要这样做。由于JIT可以避免对exp进行两次评估,因此第一个语句的优化效果远优于第二个语句。
所以我写了一个样本测试来验证这一点。但是我得到的结果是我可以得出一些结论。任何人都可以帮助我了解上述一种做法是好是坏,或者我的示例中有任何错误。
static void Main(string[] args)
{
DateTime startTime;
DateTime endTime;
for (int run = 0; run < 10; run++)
{
Console.WriteLine("--- Run #" + run.ToString());
long sumB = 0;
startTime = DateTime.Now;
for (long i = 0; i < 1000000000; i++)
{
sumB = sumB + 2L;
}
endTime = DateTime.Now;
Console.WriteLine(endTime - startTime);
long sumA = 0;
startTime = DateTime.Now;
for (long j = 0; j < 1000000000; j++)
{
sumA += 2L;
}
endTime = DateTime.Now;
Console.WriteLine(endTime - startTime);
}
Console.WriteLine("*");
Console.ReadKey();
}
最佳答案
至少在C ++中(我不知道C#),a += b
只会对a
进行一次评估,而a = a + b
会对它进行两次评估。
如果这是一个复杂的表达式,那么可能会对性能产生影响。如果像您的示例中那样,它是一个简单的变量(或更一般而言,编译器可以证明的表达式没有副作用),则应将两者都进行优化以产生相同的代码,因此,可能没有太大的区别。
更好的建议是青睐a += b
,因为它避免了冗余,提高了可读性并减少了错误的范围,而不是使用(通常是虚假的或无关紧要的)性能参数。