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...
答案 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,则不执行(计算)子语句。
注意,一定要衡量 - 你可能正在优化错误的东西。