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