使用if-return-return或if-else-return会更有效率吗?
假设我有一个return
的if
语句。 从效率的angular度来看,我应该使用
if(A > B): return A+1 return A-1
要么
if(A > B): return A+1 else: return A-1
当使用编译语言(C)或脚本语言(Python)时,我应该更喜欢哪一种?
由于return
语句终止了当前函数的执行,所以这两种forms是等价的(尽pipe第二种forms比第一种forms更具可读性)。
这两种forms的效率是可比的,如果if
条件是错误的,底层的机器代码必须执行跳转。
请注意,Python支持的语法只允许您在您的案例中使用一个return
语句:
return A+1 if A > B else A-1
从Chromium的风格指南:
退货后不要使用其他的东西:
# Bad if (foo) return 1 else return 2 # Good if (foo) return 1 return 2 return 1 if foo else 2
用任何合理的编译器,你都应该没有什么区别。 它们应该被编译成相同的机器码,因为它们是相同的。
关于编码风格:
大多数编码标准不pipe语言禁止单一函数的多重返回语句是不好的做法。
(虽然我个人认为有多种情况下多个返回语句是合理的:文本/数据协议parsing器,具有广泛的error handlingfunction等)
所有这些行业编码标准的共识是,expression应写成:
int result; if(A > B) { result = A+1; } else { result = A-1; } return result;
关于效率:
上面的例子和问题中的两个例子在效率方面完全相同。 所有这些情况下的机器代码必须比较A> B,然后分支到A + 1或A-1计算,然后将结果存储在CPU寄存器或堆栈中。
编辑:
资料来源:
- MISRA-C:2004年第14.7条,其中又引用了……:
- IEC 61508-3。 第3部分表B.9。
- IEC 61508-7。 C.2.9。
版本A更简单,这就是为什么我会使用它。
如果你在Java中打开所有的编译器警告,你会在第二个版本上得到一个警告,因为这是没有必要的,并且会增加代码的复杂性。
我会一直使用:
return A+1 if (A > B) else A-1
因为它既遵循了作为函数中最后一个语句(如前所述)的单一return语句的良好惯例,也避免了避免命令式中间结果的良好函数式编程范例。 对于更复杂的函数,我将恢复使用称为rval的命令式样式variables。 我从不使用多个返回语句,宁愿将函数分解成多个子函数,以避免这种情况发生。 我根本不考虑效率问题,因为它对我来说很重要的编码效率(即写无错代码)。