在C中,哪个更快:如果有回报,或者如果有回报?

时间:2009-07-24 02:39:28

标签: c optimization performance conditional

如果if语句中的每个块都返回,或者是否更好地拥有ifs链,那么if / else是否更好?具体而言,如果最快的话:

A:

if (condition1) {
  code1;
  return a;
}
if (condition2) {
  code2;
  return b;
}
//etc...

B:

if (condition1) {
  code1;
  return a;
}
else if (condition2) {
  code2;
  return b;
}
//etc...

7 个答案:

答案 0 :(得分:43)

没有区别,这是微观优化的不必要尝试。

答案 1 :(得分:14)

C标准指示基于C代码创建的机器语言。如果您了解底层架构,有时可以做出假设,但即使这是不明智的。

现在很久以前,CPU就是简单的野兽,因为它们具有流水线,多级缓存和各种其他奇妙的东西,可以将速度提升到极限。

在您遇到特定问题之前,您不应该担心这种优化级别(有些人会说“完全”)。

将您的代码编写为可读

这应该是规则1,2和3.你认为哪个是软件开发中最大的问题,代码以99.5%的最高速度运行,或者开发人员花费数天时间试图找出和/或修复同事(甚至是他们自己)六个月前做过什么?

我的建议是,只有当您发现问题时才会担心性能,然后在目标平台上对进行基准测试,以了解可以获得最大改进的地方。通过在代码中的其他地方选择更好的算法,if语句的1%改进可能相形见绌(其他事情,例如代码被调用的次数,当然是相同的)。应始终以优化为目标进行优化。

答案 2 :(得分:3)

通过这些回报,其他是超级的。编译器可能很聪明,可以解决这个问题。

我怀疑编译器会为两者生成相同的代码。拆开它然后看。

在任何情况下,检查编译器的输出和经验性能测试是确定的唯一方法。

答案 3 :(得分:2)

它们在大多数架构上应该是等效的。生成的指令可能仍然是相同的bne,cmps和rets。

如果您使用开关/案例而不是if语句,可能会有所帮助。

答案 4 :(得分:2)

我认为这不是一个很大的区别:

对于A案例:

if (condition){
    //conditionOp
    //cmp ... , ...
    //jxx :toEndIf
    code;
    return bar;
    //mov eax, bar
    //jmp :toEnd
}
if(condition){
    //conditionOp
    //cmp ... , ...
    //jxx :toEndIf
    code;
    return bar;
    //mov eax, bar
    //jmp :toEnd
}

对于B案例:

if(condition){
    //conditionOp
    //cmp ... , ...
    //jxx :toElse + 1
    code;
    return bar;
    //mov eax , bar
    //jmp :toEnd
} else 
    //jmp :endElse 
if (condition2){
    //conditionOp
    //cmp ... , ...
    //jxx :endElse
    code;
    return bar;
    //mov eax, bar
    //jmp :toEnd
}

因此,使用B情况,添加了一条额外的指令。虽然,优化尺寸可能会摆脱它。

答案 5 :(得分:1)

编写一个简单的测试程序来测量它并找出 - 但是这是不必要的优化。

答案 6 :(得分:0)

这应该在优化的构建中执行相同的操作。如果没有,那么其他东西可能会阻止编译器做“正确的事情”。

Robbotic不正确。在这两种情况下,如果第一个子句为true,则不执行(计算)子语句。

注意,一定要衡量 - 你可能正在优化错误的东西。