C语言中If-Else和Ternary运算符之间的速度差异?

Pat*_*k87 11 c++ performance ternary-operator

因此,在一位同事的建议下,我刚刚测试了三元运算符和等效的If-Else块之间的速度差异......似乎三元运算符产生的代码比If-Else快1到2倍.我的代码是:

  gettimeofday(&tv3, 0);
  for(i = 0; i < N; i++)
  {
     a = i & 1;
     if(a) a = b; else a = c;
  }
  gettimeofday(&tv4, 0);


  gettimeofday(&tv1, 0);
  for(i = 0; i < N; i++)
  {
     a = i & 1;
     a = a ? b : c;
  }
  gettimeofday(&tv2, 0);
Run Code Online (Sandbox Code Playgroud)

(抱歉使用gettimeofday而不是clock_gettime ......我会尽力改善自己.)

我尝试改变我对块进行计时的顺序,但结果似乎仍然存在.是什么赋予了?此外,If-Else在执行速度方面表现出更多的可变性.我应该检查gcc生成的程序集吗?

顺便说一句,这都是在优化级别零(-O0).

我是在想象这个,还是有些东西我没有考虑到,或者这是机器相关的东西,还是什么?任何帮助表示赞赏.

Ant*_*eru 24

很有可能三元运算符编译成cmovif/else结果为cmp+ jmp.只需看一下装配(使用-S)就可以了.启用优化后,无论如何都无关紧要,因为任何好的编译器都应该在两种情况下都生成相同的代码.

  • 在今天的CPU上,条件移动具有固定的延迟,而良好预测的条件分支基本上是免费的.出于这个原因,您可能没有看到优化编译器像您想象的那样经常生成`CMOV`. (13认同)

tru*_*ity 10

这是一个很好的解释:http://www.nynaeve.net/?p = 178

基本上,存在"条件集"处理器指令,其比分支指令中的分支和设置更快.


fre*_*low 9

您也可以完全无分支并测量它是否有任何区别:

int m = -(i & 1);
a = (b & m) | (c & ~m);
Run Code Online (Sandbox Code Playgroud)

在今天的架构中,这种编程风格已经过时了.

  • 当你在一个运行大量(比如数十亿)次的循环中有条件时,它仍然很有用. (2认同)