else if(cond){}和else {if(cond){}}的性能差异

Performance difference between else if( cond ) {} and else { if( cond ) {} }

本文关键字:else if cond 性能      更新时间:2023-10-16

我今天重写了我的一些旧代码来优化它,使它更容易辨认(因为其中一些代码的注释相当粗劣),我想知道这些代码块之间是否有任何技术性能差异:

if( cond1 )
{
     // Do something.
}
else if( cond2 )
{
     // Do something else.
}

:

if( cond1 )
{
     // Do something.
}
else 
{
     if( cond2 )
     {
          // Do something else.
     }
}

我对自己说,应该没有性能成本,因为应该进行相同数量的比较,但我只是好奇,是否有什么我忽略了。

让我们看看,如果使用真正的编译器有什么不同。

以下代码:

int foo(int a, int b)
{
  if(a)
    return 5;
  else if(b)
    return 2;
  else
    return 56582201;
}
int bar(int a, int b)
{
  if(a)
    return 5;
  else
  {
    if(b)
      return 2;
    else
      return 56582201;
  }
}

在GCC 4.8.0中编译时,作为g++ a.cpp -fdump-tree-gimple -c调用(没错,没有优化)会给出以下GIMPLE (GCC的内部表示):

int foo(int, int) (int a, int b)
{
  int D.2205;
  if (a != 0) goto <D.2203>; else goto <D.2204>;
  <D.2203>:
  D.2205 = 5;
  return D.2205;
  <D.2204>:
  if (b != 0) goto <D.2206>; else goto <D.2207>;
  <D.2206>:
  D.2205 = 2;
  return D.2205;
  <D.2207>:
  D.2205 = 56582201;
  return D.2205;
}

int bar(int, int) (int a, int b)
{
  int D.2211;
  if (a != 0) goto <D.2209>; else goto <D.2210>;
  <D.2209>:
  D.2211 = 5;
  return D.2211;
  <D.2210>:
  if (b != 0) goto <D.2212>; else goto <D.2213>;
  <D.2212>:
  D.2211 = 2;
  return D.2211;
  <D.2213>:
  D.2211 = 56582201;
  return D.2211;
}

如您所见,区别在于只有变量名和标签名中的,无论如何这些都将在后面被丢弃。

使用Clang编译得到类似的结果:LLVM IR实际上是相同的。

所以不,没有区别,即使你编译没有优化

它们完全一样。编译器不会完全按照您编写的代码编译代码。仅仅因为你写东西的方式不同,并不意味着编译后的可执行文件也不同。只要结果程序的行为符合c++标准所描述的,就允许对它进行任意的操作。这就是所谓的假设规则。由于您给出的两个示例代码根据标准具有完全相同的行为,编译器可能会将它们编译为相同的可执行文件。

不,一点也不。值得怀疑的是,任何编译器都会为这些生成不同的代码。

就语言而言,这两个结构是相同的。生成的代码也应该相同。