Performance 循环条件与性能
以下两个代码段在性能上有什么不同吗?或者编译器能处理这种差异吗?第一个在每次迭代时调用count()方法。第二个只调用一次Performance 循环条件与性能,performance,loops,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 } //第一个代码段 对于(i=0;i如果这是C,并且数组在循环中没
//first code segment
for(i=0; i<count(array); i++){
//code
}
//second code segment
length = count(array);
for(i=0; i<length; i++){
//code
}
//第一个代码段
对于(i=0;i如果这是C,并且数组在循环中没有变化,那么从性能的角度来看,第二个代码段通常比第一个代码段更好(并且在任何情况下都不会更差)
一次调用一个函数比多次调用更好(其他条件相同)
编译器有时可以将代码从循环内部移动到循环上方。这是被调用的。但是提升一个函数调用是非常重要的。理论上第二个代码段应该更快。但是当我在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();
//第一个代码段。
var watch=Stopwatch.StartNew();
int[]数组=新int[1000000];
对于(int i=0;i
结果是63566ms
// 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();
//第二个代码段
var watch=Stopwatch.StartNew();
int[]数组=新int[1000000];
int arrayLength=array.Count();
对于(int i=0;i
结果是66564ms.这取决于语言。如果数组可以动态调整大小(例如在javascript中)然后编译器无法对其进行优化,因为循环中的计数值可能会发生变化。在像C这样的语言中,数组是静态的,我认为编译器可以,并且确实会缓存结果。在测试中,绝大多数时间都会花在打印每个数字上。因此,测试没有说明实际的循环构造。
// 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();