繁体   English   中英

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

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

这是我最近的任务

特定变量有时会为空(除了串联在一起的某些空格外),在这种情况下,我想回显“错误”消息

这是我的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和/或OR的更复杂的语句AND可以安排这些语句“更快地失败”。 Fe使用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!";
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM