将更常见的情况放在IF语句的前面是否更有效?


Is it more efficient to put the more common case first in an IF statement?

这是我最近的任务

一个特定的变量有时会是空的(除了一些连接到其中的空格),在这种情况下,我想要回显一个"error"消息

下面是我的if语句:
if(preg_match("/^'s+$/",$var[$i])) {
  echo "Description not available";
} else {
  echo $var[$i];
}

我的问题是,由于错误是异常而不是规范,首先编写预测最常见情况的查询是否更有效?

例如:

if(!preg_match("/^'s+$/",$var[$i])) {
  echo $var[$i];
} else {
  echo "Description not available";
}
或者也许有更好的方式来写更有效?

公平地说,差异是/是不明显的,但可能根本没有区别!我不知道PHP引擎如何处理这些语句

没关系。这是用户偏好。但我认为更多人喜欢把最常见的情况写在开头。无论如何,为什么要在示例中使用preg_match ?

这是最简单的写法:

if(!empty($var[$i]) && !ctype_space($var[$i]) {       
    echo $var[$i];
} else {
    echo "Description not available!";
}

就像你看到的,我在开头使用了最常见的情况。

我已经编辑了我的答案来检查空格。无论如何,使用空格检查,正则表达式可能是更干净的解决方案。

实际上没有区别。一般来说,if()中的逻辑是最容易理解的(额外的!)增加了人工解析的复杂性)。也就是说,如果if的主体最终相对较大,而else中的代码数量较少,例如对于错误,您可能更喜欢反转逻辑并将错误放在前面,以便第一眼看到错误和大部分逻辑都可以一起看到。

如果您有嵌套的if语句,您可以组织它们,首先测试最常见的结果,以加快速度。

如果你有更复杂的语句包含AND s和/或OR s,你可以安排语句"失败更快"。例如,使用AND并首先将最有可能的选项设置为false将允许程序更频繁地跳过第二次测试。

你给出的例子没有做这些。因此,虽然有可能通过重新排序IF语句来加快速度,但在您的特定示例中是不可能的(除非您遵循@Xatenev给出的想法)。

几年前我做了一些基准测试(在PHP 5.x上),我不能清楚地说是否使用负操作符进行了时间或空间优化。

这完全取决于你的可读性,为此,我的意见是在函数/方法中首先从错误情况开始。目的是减少函数中的嵌套层次。

示例:代替

function foo() 
{
    if ($a === 1) {
        if ($b === 2) {
            if ($c === 3) {
                return doD();
            } else {
                return doC();
            }
        } else {
            return doB();
        }
    } else {
        return doA();
    }
}

你可以做

function foo() 
{
    if ($a !== 1) {
        return doA();
    }
    if ($b !== 2) {
        return doB();
    }
    if ($c !== 3) {
        return doC();
    }
    return doD();
}

查看如何通过切换布尔条件来简化嵌套级别。

当然,这只是个人使用和偏好,这里没有规则,也没有优化。

我想这样更好更快

if ( ! empty( trim($var[$i]) ) ){
     echo "Description available!";
   }
else{
     echo "Description not available!";
   }