什么是更快(x <0)或(x == -1)?

Nik*_*hhi 28 c c++ cpu optimization performance

变量x是int,带有可能的值:-1, 0, 1, 2, 3.哪个表达式会更快(在CPU滴答中):

1. (x < 0)
2. (x == -1)
Run Code Online (Sandbox Code Playgroud)

语言:C/C++,但我想所有其他语言都是一样的.

PS我个人认为答案是(x < 0).

更广泛的大师:如果x从-1到2^30?

Ada*_*eld 78

这完全取决于您正在编译的ISA以及编译器优化器的质量.不要过早优化:首先找到您的瓶颈.

也就是说,在x86中,你会发现在大多数情况下两者都同样快.在这两种情况下,您都将有一个比较(cmp)和一个条件跳转(jCC)指令.但是,对于(x < 0)某些情况,编译器可能会忽略该cmp指令,从而将代码加速一整个周期.

具体来说,如果该值x存储在寄存器中并且最近是算术运算的结果(例如add,或者sub,但是,还有更多可能性)在EFLAGS寄存器中设置符号标志SF,那么就不需要该cmp指令,编译器只能发出一条js指令.jCC当输入为-1时,没有简单的指令跳转.

  • 我不认为这是任何计划中的"瓶颈".如果你看到时间上的差异,你更有可能在== -1条件下编码"跳跃",例如将其设置为-2,因此不会终止循环(假设表达式是循环的一部分). (21认同)
  • PS不要小看这个问题 - 我的循环太紧,这种优化会产生影响.通常只有百分之几,但有时候每一点都有帮助! (16认同)
  • 不要忘记cmp指令可能被一个或多个指令替换,这不会减少周期数,但可能会改变内存对齐.这可能会有所帮助,或者可能适得其反,这就是分析如此重要的原因. (5认同)

GMa*_*ckG 23

为什么?无论您做什么,编译器都会在您当前正在编译的任何平台上对其进行优化.

如果你需要检查它是否为-1,请使用(x == -1),如果你想知道它是否小于零,请改用它.写下你会大声朗读的内容.

像这样的微小的东西不会让任何事情变得更快,你应该担心可读性和干净的设计,而不是哪个微小的操作更快.

即使它没有做任何逻辑更改,机会在您的平台上,两者都将在一个CPU周期内执行.

  • 如果您从这么小的任何东西中获得显着的性能提升,那么您的设计可能需要重构(更合适的算法).但正如其他人所说的那样,对其进行分析以了解您当前的情况. (8认同)
  • "所有瓶颈通常都很小"这不是很正确.大多数瓶颈来自以不正确的方式解决问题.不是通过潜在地节省1个CPU滴答.:/ (6认同)
  • 所有的瓶颈通常都很小,即使是完美的设计和完美的算法(尽管没有这样的).我做高负荷的DNA处理,并且非常了解我的领域和算法. (5认同)
  • @nikolay:哇.这实际上比程序中的缓存未命中成本要小? (3认同)

Ale*_*man 11

试试看吧!做一百万甚至更好,每个十亿,并计时.我敢打赌,你的结果没有统计意义,但谁知道 - 也许在你的平台和编译器上,你可能会找到一个结果.

这是一个很好的实验来说服自己,过早的优化可能不值得你花时间 - 而且可能是" 所有邪恶的根源 - 至少在编程中 ".

  • 这是建议,但不是真正的答案。 (2认同)

Gav*_*n H 7

这两个操作都可以在一个CPU步骤中完成,因此它们应该具有相同的性能.

  • Arrrghh!虽然绝大多数芯片都是如此,但如果不了解他正在使用的平台,你就不能*做出明确的声明.全世界都不是x86. (9认同)
  • 好吧,如果他问这个问题是为了一个特定的,非正常的架构,我会假设他会这样说.如果他总的来说,我试图给大多数现代建筑提供一个简单的答案. (3认同)
  • 只是大部分;) (2认同)

Kri*_*son 7

它可能取决于比较之前或之后的操作.例如,如果在进行比较之前将值赋给x,则检查符号标志可能比比较特定值更快.或者CPU的分支预测性能可能会受到您选择的比较的影响.

但是,正如其他人所说,这取决于CPU架构,内存架构,编译器和许多其他东西,因此没有一般性的答案.


Pho*_*Guy 7

x <0会更快.如果没有别的,它会阻止将常量-1作为操作数获取.大多数架构都有特殊的指令用于比较零,所以这也有帮助.

  • 在不了解架构和/或编译器的情况下,您如何判断这一点? (2认同)