以下两个代码段之间的性能是否有任何差异?或编译器处理差异?第一个在每次迭代时调用count()方法。第二个只调用一次。
//first code segment
for(i=0; i<count(array); i++){
//code
}
//second code segment
length = count(array);
for(i=0; i<length; i++){
//code
}
答案 0 :(得分:2)
理论上第二个代码段应该更快。但是,当我在C#中测量以下两个代码段时,它表明第一个段的运行速度更快:
// First code segment.
var watch = Stopwatch.StartNew();
int[] array = new int[1000000];
for (int i = 0; i < array.Count(); i++)
{
Console.WriteLine(i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
Console.ReadKey();
结果 63566 ms。
// Second code segments
var watch = Stopwatch.StartNew();
int[] array = new int[1000000];
int arrayLength = array.Count();
for (int i = 0; i < arrayLength; i++)
{
Console.WriteLine(i);
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
Console.ReadKey();
结果 66564 ms。
答案 1 :(得分:0)
如果这是C并且数组在循环中没有变化,那么从性能的角度来看,第二个代码段通常比第一个更好(并且在任何情况下都不会更糟)。
调用函数一次与多次相比更好(所有其他条件相同)。
编译器有时可以将代码从循环内部移动到循环上方。这称为loop invariant code motion。但是提升函数调用并非易事。