for循环倒数到0会更快吗?

Posted

技术标签:

【中文标题】for循环倒数到0会更快吗?【英文标题】:Is it faster for a for loop to count down to 0? 【发布时间】:2019-05-09 17:35:38 【问题描述】:

根据这个blog,这个代码

for( i =0; i<10; i++)

比这段代码慢

for(i=10; i--; )

因为

测试某个值是否等于 0 比比较两个不同的数字要快。

这是真的吗?为什么?

【问题讨论】:

显然这行代码比较慢 -- 不,不明显。 不要使用那个网站。该人使用#define 的常量并认为for(int* ptrInt = nArray; ptrInt&lt; nArray+n; ptrInt++) *ptrInt=nSomeValue;for(int i=0; i&lt;n; i++) nArray[i]=nSomeValue; 快。他们一定不知道优化器是什么。 同意该网站看起来很糟糕,但我编辑了问题以提出有关 for 循环的具体声明。这是我以前见过的说法,所以如果它是假的,那就值得揭穿了。 最好只在分析器告诉您这样做时才进行优化。 我们有一个good C++ books 列表,其中涵盖了其中的一些内容。 youtube 上还有一堆来自 CPPCON 频道的视频,其中有很多关于它的讨论。多年来,Chandler Carruth 在那里进行了几次非常好的演讲。 【参考方案1】:

该博客是正确的,但是根据我的经验,性能比更改一些小调整要复杂。

重要的元素不是循环的顺序。当从 -10 变为 0 时,您会得到相同的效果。这里的相关元素是与 0 的比较。CPU 有专门的指令来与 0 进行比较,而与任何其他数字的比较需要使用通用比较。

所以对于循环,是的,它会更快。不过,如前所述,还有很多事情在起作用。编译器优化行循环展开可以删除整个循环。几乎任何操作都比循环本身更昂贵,并且算法更改可以节省大量时间。

有关与零比较的更多详细信息,您可以从以下线程开始:Is comparing to zero faster than comparing to any other number?

【讨论】:

【参考方案2】:

它知道这个循环的最后位置是 0,所以不能检查条件。 所以它直接 i-1 然后打印

int main()
   
      int i;
       for( i =10; i--;)
       
       cout<<i;
       

     return 0;
   

【讨论】:

以上是关于for循环倒数到0会更快吗?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以比 for 循环更快地遍历数组吗?

for循环比较

如何使这个 for 循环更快?

如何使这个 for 循环更快?

java中大量使用二维数组和for循环会发生内存泄露吗?该怎么解决?

在 Python 中使用数组更快的 for 循环