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< nArray+n; ptrInt++) *ptrInt=nSomeValue;
比for(int i=0; i<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会更快吗?的主要内容,如果未能解决你的问题,请参考以下文章