gpt4 book ai didi

c++ - 比较 int 的正向和反向循环,其中一个限制为 0

转载 作者:太空狗 更新时间:2023-10-29 20:06:49 24 4
gpt4 key购买 nike

考虑带有 for 循环的例子:

for(int i = 0; i <= NUM; i++);  // forward
for(int i = NUM; i >= 0; i--); // reverse

我用 gcc (linux-64) 测试了这个循环。在没有任何优化标志的情况下,正向循环速度更快,而优化到 O3/O4 后,反向循环速度更快。

我在某处听说由于更好的缓存替换技术,前向循环更快。

我个人认为,反向循环应该更快(无论 NUM 是常量还是变量)。因为任何微处理器都有与 0 进行比较的单条指令,i >= 0(即 JLZ(如果小于零则跳转) 和等价物)。

对此有确定性的答案吗?

最佳答案

不,绝对没有对此有确定性的答案。您正在查看两个不同的抽象级别。

C++ 绝对没有可以说明幕后发生的事情,性能方面。它指定了一个执行 C++ 代码的虚拟机,虽然它涵盖了功能,但不涵盖底层环境的性能 (a)

哪一个更快取决于多种因素。您可能会发现自己在 CPU 上运行,该 CPU 不区分与任意值的比较和与零的比较。

您可能会发现一种架构,其中递增寄存器比递减寄存器快十倍,尽管这看起来很奇怪。

你甚至可能会发现一个脑死亡的架构,它根本没有递减、加或减指令,你必须通过调用递增 2n-1 次来模拟递减(其中 n 是字长)。

底线:除非您想查看非常具体的 CPU、编译器等,否则您不能假设知道引擎盖下发生了什么。

您应该首先优化代码以提高可读性。如果您需要以递增的方式处理事物,请使用第一个选项。如果是递减方式,则使用后者。如果任何一种方式看起来同样自然,那么选择最快的方式,通过基准测试或底层架构和汇编代码的分析发现。但是,在遇到特定性能问题时才这样做,否则就是在浪费精力。

在任何情况下,由于您几乎肯定会使用 i 来做某事,所以通过最快的方式获得的任何性能微小提升都可能您现在必须在循环内计算 NUM-i 的事实会让您不知所措(当然,除非编译器比开发人员更聪明,根据我从gcc,很有可能)。


(a) 它确实指定了某些与性能相关的东西,例如容器库中某些东西的时间复杂度,但不是具体你要问的东西关于前向循环或反向循环是否更快。

关于c++ - 比较 int 的正向和反向循环,其中一个限制为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6055682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com