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

有很多if语句会降低php的渲染速度吗?,php,performance,Php,Performance,我想知道我的PHP代码中复杂的if/else结构是否是一个糟糕的设计决策。有很多if语句会使PHP运行变慢、站点加载变慢等吗 代码如下: (我不知道wordpress如何处理页面等) 在大多数情况下,非常复杂的if/else结构表明设计不好。您可以更好地专注于改进糟糕的设计,而不是优化 如果你给出一个你正在谈论的代码类型的例子,也许可以给出更详细的答案。不。事实上,在大多数情况下,它实际上会加快速度(因为它可以跳过代码块) 大量if语句唯一会使其变慢的时间是您正在检查的条件是否需要处理。例如:

我想知道我的PHP代码中复杂的if/else结构是否是一个糟糕的设计决策。有很多if语句会使PHP运行变慢、站点加载变慢等吗

代码如下: (我不知道wordpress如何处理页面等)


在大多数情况下,非常复杂的if/else结构表明设计不好。您可以更好地专注于改进糟糕的设计,而不是优化


如果你给出一个你正在谈论的代码类型的例子,也许可以给出更详细的答案。

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

大量if语句唯一会使其变慢的时间是您正在检查的条件是否需要处理。例如:

while (true)
{
    if (count($some_array) == 0) { break; }
    /* some other code */
}
通过循环的任何迭代都会检查
计数($some_数组)=0
。这意味着每次通过时,PHP都必须手动计算
$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;如果($a>0 | |$b>100 | |$c>200){}


一旦PHP发现满足了
$a>0
条件,整个语句将解析为true(因为使用了OR值),并且不必费心检查
$b>100
$c>200

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

如果子句是一些最便宜的操作,那么从性能角度来看

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

例如,
if(true){…}
的速度会非常快,但是一个
if(calculatePi()){…}
就要花很长时间。
if
本身速度非常快,您不必担心它,此外,您所做的几乎所有其他事情都涉及大量的
if
语句,例如,当您执行
for
while
循环或
switch
语句时。所有这些本质上都包含
(一个或多个)if

至于设计,许多
if
s可能会让其他开发人员感到困惑,这取决于您所写的内容和编写方式。有时您最好使用switch/case语句或其他一些应用程序工作流,但说实话,一堆
if
s可能会比您可能想到的任何类型的结构执行得更快。但是,只有当你唯一关心的是表现的时候,才把它放在心上。我再说一遍,设计软件主要不是为了性能。好的软件设计是关于其他方面的,比如可维护性,即阅读和成功升级代码的容易程度

简言之,如果您正在优化性能,不要费心减少
if
s的数量。如果s询问的是什么,或者根据返回的是真还是假,关注发生了什么


希望能有所帮助。

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

1) 否则,状态应按条件概率的降序排列。 在我的
wp_posts
数据库表中,80%的记录具有
post_状态
“草稿”、“待处理”、“垃圾”等,但没有“发布”。大约40%的记录将“post”作为
post\u类型
。所以,没有必要

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的数据库模式表明,_category()中的
将很慢。如果是您自己编写的某个查询,当然,这取决于您的查询的效率

我刚刚从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.';
}
$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!';
好:网关风格

$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方法询问重要条件是否为真,并且仅在它们为真时运行代码

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

bubble方法强制嵌套,因为在获得要运行的代码之前,必须检查“true,true,true,true”。每个“true”检查都是嵌套的一个级别—代码必须处于嵌套状态

网关方法未嵌套: 正如你所看到的,代码从来都不是