循环条件和性能

时间:2014-10-20 14:30:55

标签: performance loops

以下两个代码段之间的性能是否有任何差异?或编译器处理差异?第一个在每次迭代时调用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
}

2 个答案:

答案 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。但是提升函数调用并非易事。