有很多if语句会降低php的渲染速度吗?

问题描述 投票:8回答:6

我想知道在我的PHP代码中复杂的if / else结构是否是一个糟糕的设计决策。有很多if语句会导致PHP运行缓慢,站点加载速度较慢等吗?

这是代码:(我不知道wordpress如何处理is_page等)

<?php

if (is_page()) {
//
    if (is_page(122)) {
    //subscribe page
    echo "subscribe page";

    }

    elseif (is_page(1263)) {
    //photography course
    echo "photography course page";

    }

    elseif (is_page(array(210,184,128))) {
    //210 copyright policy, 184 privacy policy, 128 contact
    echo "this is either copyright policy, privacy or contact page!";
    //nothing happens here, we don't need social buttons on these pages.
    }

    elseif (is_page(array(379,71,7,45,124,8,105,175,9,125,110))) {
    //379 photo galleries, 71 car photos, 7 conceptual, 45 event photos, 124 fashion, 8 landscape, 105 misc, 175 journalism, 9 portrait, 125 street photography, 110 travel
    echo "gallery pages and albums";

    }

    else {
    //any other page
    echo "any other page";

    }
//
}

elseif (is_single()) {
//
    if (in_category(array(147,196,35))) {
    //147 car photography, 196 car wallpapers, 35 photo stories
    echo "photo posts";

    }
    else {
    //any other post
    echo "any other post";

    }
//
}

elseif (is_archive()) {
//
    //any category
    echo "this is archive template"

}
//
?>
php performance
6个回答
13
投票

不。事实上,在大多数情况下它实际上会加速它(因为它允许跳过代码块)。

只有当您检查的条件需要处理时,大量if语句才会减慢它的速度。一个例子是:

while (true)
{
    if (count($some_array) == 0) { break; }
    /* some other code */
}

通过循环迭代检查是否count($some_array) == 0。这意味着每次传递,PHP都必须手动count $some_array中的项目数量,因为它可能已经改变。这也适用于for循环中的停止条件。这是因为for循环总是可以重写为while循环:

for ([INITIALIZER_ACTION]; [CONDITION]; [POST_ITERATION_ACTION]) { [CODE]; }

是相同的...

[INITIALIZER_ACTION];
while ([CONDITION]) { [CODE]; [POST_ITERATION_ACTION]; }

如果你正在考虑将一堆if语句合并为一个:不要,你就不会得到任何好处。 PHP会短路,这意味着如果它达到了解结果的程度,那么它将跳过其余部分。

例如,考虑$a = 5; if ($a > 0 || $b > 100 || $c > 200) {}。 一旦PHP看到满足$a > 0条件,整个语句解析为true(因为OR值的使用)并且不打扰检查$b > 100$c > 200

所以回答你的问题:除非你有一些不合适的条件,每个条件都需要复杂的计算或有副作用,你通常可以认为它们的数量是无关紧要的。 但是,正如其他人所指出的那样,if语句太多会降低代码的可读性。在许多情况下,如果您可以删除条件而不影响代码的行为,那么您不需要它开始。


5
投票

If-clauses是一些最便宜的操作,性能方面。

但是,你在if子句中放入的内容可能非常慢。

例如,if (true) { ... }将会非常快,但单个if (calculatePi()) { ... }将永远占据一席之地。 if本身是如此之快,以至于你永远不必担心它,此外,你所做的其他一切都涉及到许多ifs,例如当你做forwhile循环或switch语句时。所有这些本质上都包含if(一个或多个)。

至于设计,很多ifs可能会让其他开发人员感到困惑,这取决于你写的是什么以及它是如何编写的。有时候你最好使用switch / case语句或其他一些应用程序工作流程,但是说实话,一堆ifs可能比你想出的任何结构都要快。但是,如果您唯一的关注点是表现,那么只能牢记这一点。我重申,设计软件不是主要关乎性能。良好的软件设计与其他方面有关,例如可维护性,即读取和成功升级代码的容易程度。

简而言之,如果您正在优化性能,请不要试图减少ifs的数量。而是关注ifs所询问的内容,或者取决于它们是返回真还是假而发生的事情。

希望能帮助到你。


4
投票

我刚刚从WPShout中看到了一段非常有趣的article,它使用了一个非常人性化的类比来邀请我们编写更智能的代码,以及为什么深度嵌套的if { .. }语句不仅会降低性能,还会降低代码的可维护性。如果逻辑是性能感知的,没有不必要的膨胀迭代检查,那么你最终可能会得到一个组织良好,响应更快的代码。

代码示例(摘自文章)

“让我们通过查看两个简单的代码示例来实现这一点:首先是泡泡式,然后是网关式”。

坏:泡泡风格

$is_first_thing_working = true;
$is_second_thing_working = true;
$is_third_thing_working = true;
$is_fourth_thing_working = true;

if( $is_first_thing_working === true ) {
    if( $is_second_thing_working === true ) {
        if( $is_third_thing_working === true ) {
            if( $is_fourth_thing_working === true ) {
                return 'Working properly!';
            }
            else {
                return 'Fourth thing broken.';
            }
        }
        else {
            return 'Third thing broken.';
        }
    }
    else {
        return 'Second thing broken.';
    }
}
else {
    return 'First thing broken.';
}

好:网关式

$is_first_thing_working = true;
$is_second_thing_working = true;
$is_third_thing_working = true;
$is_fourth_thing_working = true;

if( $is_first_thing_working !== true ) {
    return 'First thing broken.';
}

if( $is_second_thing_working !== true ) {
    return 'Second thing broken.';
}

if( $is_third_thing_working !== true ) {
    return 'Third thing broken.';
}

if( $is_fourth_thing_working !== true ) {
    return 'Fourth thing broken.';
}

return 'Working properly!';

关于例子的说明

上面两个代码片段之间的区别归结为一个关键的区别:

泡沫方法询问重要条件是否为真,并且只有在它们为真时才运行代码。

网关方法询问重要条件是否为假,并在每个条件为假时立即发出退出指令。

bubble方法强制嵌套,因为在到达要运行的代码之前,必须检查“true,true,true,true”。每个“真实”检查都是嵌套级别 - 您的代码必须存在于其中的条件。

网关方法不是嵌套的:如您所见,代码永远不会超过一层逻辑深度。这是因为一旦给定网关通过,我们就可以完全忘记它。换句话说,由于我们在$is_first_thing_working检查后没有退出,我们自动知道$is_first_thing_working对于其余的代码是正确的。

“这就像现实生活:如果你在历史课上坐在我旁边,我知道你是一个人,一个在我高中的学生,等等 - 否则你从来没有在我的班上这个地方。不需要检查。“


3
投票

非常复杂的if / else结构在大多数情况下表明设计不好。你可以更好地专注于改善糟糕的设计,而不是优化,premature optimization is the root of all evil!

如果您举例说明您正在讨论的代码类型,则可能会给出更详细的答案。


0
投票

问题不在于有太多if else语句,而是1)它们的顺序和2)你的条件有多高效

1)如果其他状态应按条件概率的降序排列。在我特别的wp_posts数据库表中,80%的记录有post_status的“草稿”,“待定”,“垃圾”等,但不是“发布”。大约40%的记录有“post”作为post_type。所以,拥有它是没有意义的

if ($post_type=="post"&&$post_status=="publish") {
    doA();
} elseif ($post_type!="post"&&post_status=="publish") {
    doB():
} elseif ($post_type=="post"&&post_status!="publish") {
    doC();
} else {
    doD();
}

但它应该按相反的顺序排列

关于2),WordPress的数据库架构表明in_category()会很慢。如果这是您自己编写的一些查询,当然,这取决于查询的效率


0
投票

在某种程度上......是的。 我说这是考虑最坏的情况,在这种情况下是一个非常大的模型对象,有很多条件。在这里,代码必须经历所有条件检查,最终减慢代码。 条件语句对并行化和向量化造成困难,并且一长串IF-THEN也可能导致指令高速缓存未命中和其他影响。但如果这是使代码最清晰的原因,那么就使用它。

© www.soinside.com 2019 - 2024. All rights reserved.