Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/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
循环比逐个遍历快吗 让我们考虑下面C++中的代码片段来打印第一个10个正整数: for (int i = 1; i<11;i++) { cout<< i ; } 对于(int i=1;i_C++_Performance_Loops - Fatal编程技术网

循环比逐个遍历快吗 让我们考虑下面C++中的代码片段来打印第一个10个正整数: for (int i = 1; i<11;i++) { cout<< i ; } 对于(int i=1;i

循环比逐个遍历快吗 让我们考虑下面C++中的代码片段来打印第一个10个正整数: for (int i = 1; i<11;i++) { cout<< i ; } 对于(int i=1;i,c++,performance,loops,C++,Performance,Loops,在循环中,实际的机器级指令将是相同的,因此地址相同。在显式语句中,指令将具有不同的地址。因此,对于循环,CPU的指令缓存可能会提供后一种情况下可能不会出现的性能提升 对于非常小的范围(10),差异很可能可以忽略不计。对于循环的有效长度,它可以更清楚地显示出来。这个问题类似于;我复制了下面的摘录…(数字不同;11与50;分析相同) 您正在考虑的是一种手动形式的循环展开。循环展开是一种优化,编译器有时会使用它来减少循环中涉及的开销。只有在编译时知道循环的迭代次数时,编译器才能这样做(即迭代次数为常数

在循环中,实际的机器级指令将是相同的,因此地址相同。在显式语句中,指令将具有不同的地址。因此,对于循环,CPU的指令缓存可能会提供后一种情况下可能不会出现的性能提升


对于非常小的范围(10),差异很可能可以忽略不计。对于循环的有效长度,它可以更清楚地显示出来。

这个问题类似于;我复制了下面的摘录…(数字不同;11与50;分析相同)

您正在考虑的是一种手动形式的循环展开。循环展开是一种优化,编译器有时会使用它来减少循环中涉及的开销。只有在编译时知道循环的迭代次数时,编译器才能这样做(即迭代次数为常数,即使该常数涉及基于其他常数的计算)。在某些情况下,编译器可能会确定展开循环是值得的,但通常不会完全展开。例如,在您的示例中,编译器可能会确定将循环从50次迭代展开到只有10次迭代(包含5个循环体副本)。循环变量仍然是在这里,代码不再对循环计数器进行50次比较,而是只需进行10次比较。这是一种折衷,因为循环体的5个副本占用了缓存中5倍的空间,这意味着加载相同指令的额外副本会迫使缓存退出(抛出)那么多已经在缓存中并且您可能希望保留在缓存中的指令。此外,从主存加载循环体指令的4个额外副本所需的时间远远超过在循环根本没有展开的情况下从缓存中获取已加载的指令所需的时间


总而言之,只使用循环体的一个副本,继续并保留循环逻辑(即根本不进行任何循环展开)通常更为有利

比较操作的数量。这是一样的。有什么理由认为循环应该更快?是的。缓存。@lukai我认为操作的数量不一样:在非循环版本中没有进行比较。(尽管这种方法在现实生活中几乎没有用)它是受I/O限制的。您不会注意到,甚至可能不会测量计算时间差。请注意,第二种方法违反了DRY原则(),并且会使程序难以维护。再加上编译器已经足够聪明,可以在“幕后”执行同样的操作在编译时,如果可能有帮助的话,实际上没有理由手动执行。
x =1;

cout<< x;

x++;

cout<< x;