【问题标题】:cost of == operator vs < or > operators [closed]== 运算符与 < 或 > 运算符的成本 [关闭]
【发布时间】:2012-06-24 16:40:10
【问题描述】:

这实际上只是一个学术问题,我只是想知道哪个更快。我猜差异可以忽略不计,但我还是想知道。

if( (x == 1) || (x == 2) )

if (x < 3)

谢谢!

【问题讨论】:

  • 你试过了吗...?我猜x &lt; 3 更快,因为它的汇编代码更短。而且问题应该是特定于一种语言的。
  • 这两个条件甚至不等价。 0 &lt; 3!((0 == 1) || (0 == 2)).
  • 是的 larsmans 和 -345 也是

标签: performance operators micro-optimization


【解决方案1】:

在您提供的表格中,复杂性存在明显差异:第一个代码使用 3 个运算符,然后第二个 - 仅一个。但是好的,让我们输入这段代码并假设你想比较&gt;(或&lt;)和==!=)。如果您在检查程序时遇到过汇编程序(但我打赌您没有),您会注意到这样的代码

if (x < 3) /* action */;

被翻译成类似的东西(对于 x86 CPU):

  cmp %eax, 3   // <-- compare EAX and 3. It modifies flags register(*1) (namely ZF, CF, SF and so on)
  jge @@skip    // <-- this instruction tells CPU to jump when some conditions related to flags are met(*2).
                // So this code is executed when jump is *not* made (when x is *not*
                // greater or equal than 3.
  /* here is action body */
@@skip:
  // ...

现在考虑这段代码:

if (x == 3) /* action */;

它将给出几乎相同的程序集(当然,它可能与我的不同,但在语义上没有区别):

  cmp %eax, 3
  jne @@skip // < -- here is the only difference
  /* action is run when x is equal to 3 */
@@skip:
  ...

这两个运算符(jgejne 和其他跳转)以相同的速度完成它们的工作(因为 CPU 是这样制造的,但这显然取决于它的架构)。对性能的影响更大的是跳转距离(代码位置之间的差异)、缓存未命中(当处理器错误地预测跳转时)等等。有些指令甚至更有效(例如使用更少的字节),但请记住唯一的一点:不要太关注它们。进行算法优化总是更好,不要节省匹配。让编译器为你做——在这类问题上它确实更胜任。专注于您的算法、代码可读性、程序架构、容错性。速度是最后一个因素。

(*1): http://en.wikipedia.org/wiki/FLAGS_register_%28computing%29
(*2):http://www.unixwiz.net/techtips/x86-jumps.html

【讨论】:

  • +1 表示好的、详细的,最重要的是,正确的答案!
  • @DavidTitarenco,谢谢)
  • 非常感谢这个回答,这真的很好。
  • 所以,David Titarenco,首先你帮助我以“不具建设性”的身份结束我的问题,然后当我得到我正在寻找的确切答案时,你祝贺那个人。请保持一致。
  • 记录在案:您说“复杂性存在明显差异”,我想这很公平。但这只是因为您的其余答案。例如,如果“
猜你喜欢
  • 1970-01-01
  • 2012-04-19
  • 2011-03-27
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多