【问题标题】:Is It More Efficient to Do a Less Than comparison OR a Less Than Or Equal To?做小于比较还是小于或等于更有效?
【发布时间】:2014-04-19 04:27:32
【问题描述】:

我想知道在循环中进行小于或等于比较或小于比较是否更有效。 <= 运算符是指示计算机进行两次比较(是小于还是等于),还是简化了它?举个例子。我想要一个循环而不是递增到 1000。我是否应该将上限设置为 1001 并告诉它while i is < (OR !=) 1001, i++;?或者我应该告诉它while i <= 1000, i++;?编译器 (GCC) 会将其简化为相同的基本指令吗?

【问题讨论】:

  • 两者都使用机器级指令。完全没有区别。
  • 如果可能,向后运行循环会更有效,这样您就可以针对 0 而不是常数测试 i
  • 怎么会便宜?
  • @chepner,哇,这对我来说是新事物,它如何更有效率?因为我们只需要检索 i 一次?
  • @chepner 是的,但它进入了微优化领域。然后,您将不得不担心 CPU 在向后运行时是否正确预取数据缓存(确实如此,但参数可能与从升序地址预取不同。)有很多事情要担心,我不会除非基准另有说明,否则请放心。

标签: c++ loops optimization compiler-construction operators


【解决方案1】:

测量它。只有这样,您才能绝对确定哪个更快。

您可能会想很多关于这里发挥作用的所有部分(编译器、优化、处理器等)。但最终,如果花费的时间更少,它会更快。就这么简单。

【讨论】:

    【解决方案2】:

    这取决于架构。

    最初的冯诺依曼 IAS 架构 (1945) 确实只有 >= 比较。

    Intel 8086可以使用Loop label范式,对应do { } while (--cx > 0);
    在遗留架构中,LOOP 不仅更小,而且更快。在现代架构中,LOOP 被认为是复杂的操作,它比dec ecx; jnz label; 慢。在优化大小 (-Os) 时,这仍然很重要。

    进一步的考虑是一些(RISC)架构没有明确的标志寄存器。然后不能免费进行比较,这是循环减量的副作用。一些 RISC 架构也有一个特殊的“零”寄存器,这意味着与零的比较(以及所有其他数学运算)始终可用。具有跳转延迟槽的 RISC 甚至可以从使用后减量中受益:do { } while (a-- > 0);

    优化编译器应该能够将简单循环转换为给定架构的最优化版本,而不管语法如何。一个复杂的循环会依赖于迭代器、副作用或两者:for (i=0;i<5;i++) func(i);

    【讨论】:

      【解决方案3】:

      机器级架构将具有

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 2011-01-25
        • 1970-01-01
        • 2013-09-02
        相关资源
        最近更新 更多