是否应在if语句中重复计算


Should calculations be repeated in if statements?

如果在if语句的求值表达式中使用计算,然后在执行语句中再次使用计算,那么执行两次计算或引入新变量的效率会更高还是更低?

换句话说,

if ($x <> some_complex_calculation()) {
    ...
    $x = some_complex_calculation();
}

比这更好:

$result = some_complex_calculation();
if ($x <> $result) {
    ...
    $x = $result;
}

或者,这是吗

if ($x <> get_something_from_database()) {
    ...
    $x = get_something_from_database();
}

比这更好:

$result = get_something_from_database();
if ($x <> $result) {
    ...
    $x = $result;
}

当然,保存计算结果总是更有效的,无论它多么琐碎,所以如果这就是你所关心的,那么使用临时选项是唯一的"正确"选项。

也就是说,只有当计算占用了相当大的总运行时间时,性能方面才会很重要,这在实践中是不寻常的。另一方面,还有其他因素可以影响甚至支配你的决定:

正确性:如果您进行两次计算,则应用程序状态可能会在两次计算之间发生变化。所以你会输入一个分支,因为例如get_something() > 5,但在分支内部可能是get_something() <= 5,因为其他人在此期间修改了数据。这对你重要吗?在这种情况下,您希望应用程序如何运行?这些问题远比"它会跑得更快吗"更重要。

可理解性:每当我看到一个变量被定义时,我通常都必须分配一个"心理槽"来跟踪该变量及其用法,直到我弄清楚它的定义函数是如何作为一个整体工作的。如果代码使用了太多的临时代码,那么读者的认知负荷就会增加。这对你重要吗?相对影响与性能差异是什么?

如果计算在每次调用时都有不同的参数,因此结果也不同,那么每次都需要调用它。例如:

function add( a, b ) 
{
   return a + b;
}

这样称呼:

if( add( 1, 2) > a )
else if ( add( 4,5 ) > c )

这将每次返回不同的值,因此您需要在if.中进行计算

然而,如果每次都是相同的比较值,如果多次使用,最好存储结果:

result = add(5, 6)
if( result > 10 ) 
else if( result > 12 )