Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 循环条件与性能_Performance_Loops - Fatal编程技术网

Performance 循环条件与性能

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,并且数组在循环中没

以下两个代码段在性能上有什么不同吗?或者编译器能处理这种差异吗?第一个在每次迭代时调用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,并且数组在循环中没有变化,那么从性能的角度来看,第二个代码段通常比第一个代码段更好(并且在任何情况下都不会更差)

一次调用一个函数比多次调用更好(其他条件相同)


编译器有时可以将代码从循环内部移动到循环上方。这是被调用的。但是提升一个函数调用是非常重要的。

理论上第二个代码段应该更快。但是当我在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();