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

8 php performance

我想知道在我的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"

}
//
?>
Run Code Online (Sandbox Code Playgroud)

Mr.*_*ama 13

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

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

while (true)
{
    if (count($some_array) == 0) { break; }
    /* some other code */
}
Run Code Online (Sandbox Code Playgroud)

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

for ([INITIALIZER_ACTION]; [CONDITION]; [POST_ITERATION_ACTION]) { [CODE]; }
Run Code Online (Sandbox Code Playgroud)

是相同的...

[INITIALIZER_ACTION];
while ([CONDITION]) { [CODE]; [POST_ITERATION_ACTION]; }
Run Code Online (Sandbox Code Playgroud)

 

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

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

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


Tee*_*kin 5

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

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

例如,if (true) { ... }速度会非常快,但单个if (calculatePi()) { ... }字体将永远占据一席之地.它if本身是如此之快,以至于你永远不必担心它,此外,你所做的其他事情if无论如何都涉及到很多,例如当你做forwhile循环或switch陈述时.所有这些本质上都包含if(一个或多个).

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

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

希望能帮助到你.


Adr*_*chi 5

我刚刚看过WPShout 的一篇非常有趣的文章,该文章使用非常人性化的类比来邀请我们编写更智能的代码,以及为什么深层嵌套的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.';
}
Run Code Online (Sandbox Code Playgroud)

良好:网关样式

$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!';
Run Code Online (Sandbox Code Playgroud)

范例说明

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

bubble方法询问重要条件是否为真,并且仅在满足条件时才运行代码。

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

冒泡方法会强制嵌套,因为在进入要运行的代码之前必须先检查“ true,true,true,true”。每个“ true”检查都是一个嵌套级别,这是您的代码必须存在的条件。

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

“这就像现实生活:如果您在历史课上坐在我旁边,我知道您是人类,是我高中的学生,等等–否则您将永远不会上过我的课地方。无需检查。”