Php 大量if或语句是否会导致性能问题?
我有一个菜单,根据语言有条件地显示 看起来是这样的:Php 大量if或语句是否会导致性能问题?,php,performance,if-statement,Php,Performance,If Statement,我有一个菜单,根据语言有条件地显示 看起来是这样的: if ( $page == "page1.htm" || $page == "page2.htm" || $page == "page3.htm" || etc couple 100 of those ) { //output menu } for($i=0; $i<$no_of_pages; $i++){ $pages[$i] = 'page'.($i+1).'.htm'; } if(in_array($page, $page
if (
$page == "page1.htm" ||
$page == "page2.htm" ||
$page == "page3.htm" ||
etc couple 100 of those
) {
//output menu
}
for($i=0; $i<$no_of_pages; $i++){
$pages[$i] = 'page'.($i+1).'.htm';
}
if(in_array($page, $pages)){
//your condition here
}
我在一个if中有几百个这样或那样的语句 这会对性能产生可测量的影响吗
我对可维护性不感兴趣,只对性能感兴趣。我想知道它是否值得优化。每当您发现自己在
if
语句中大量使用|
时,那么您最好在数组()中使用:
我会使用RegExp,您也可以根据自己的需要进行编辑:
if (preg_match("/^page[0-9]{1,3}\.htm$/", $page)){
//Execute if this is a page.
}
在我看来,最好创建某种复杂模式/几种模式来检查,因为它:
- 可能会提高性能
- 将保持代码的整洁(这是最重要的)
好吧,也许我最好把我的评论作为回答。如果此时确实不想(或不能)重新思考代码:
$pages = array_fill_keys(array("page1.htm", "page2,htm", "page3.htm"), true);
if (array_key_exists($page, $pages))
{
//do whatever
}
再次,如果您检查客户机是否正在请求一个现有页面,您可以考虑使用:
if (file_exists($page))
{
require_once($page);
}
或者类似的。当然,检查$page
变量是否有/etc/httpd/httpd.conf
,或者是否有太多的。/..
位和螺栓。。。永远不要信任网络:)如F4r-20所述,在数组()中使用
是个好主意。此外,如果您确定页面将命名为page1.htm
,page2.htm
等,则可以使用for循环
构造来执行任务;像这样:
if (
$page == "page1.htm" ||
$page == "page2.htm" ||
$page == "page3.htm" ||
etc couple 100 of those
) {
//output menu
}
for($i=0; $i<$no_of_pages; $i++){
$pages[$i] = 'page'.($i+1).'.htm';
}
if(in_array($page, $pages)){
//your condition here
}
对于($i=0;$i我更喜欢这些代码行:
$page="page10.htm"; //Example data
$match=array();
preg_match('/page(\d*)\.htm/', $page,$match);
$match=$match[1];
switch($x)
{
case $x>1 && $x<40:
echo "uder 50";
break;
case $x>40:
echo "upper 50";
break;
}
$page=“page10.htm”//示例数据
$match=array();
预匹配('/page(\d*)\.htm/',$page,$match);
$match=$match[1];
交换机($x)
{
案例$x>1&$x40:
回声“上50”;
打破
}
“我在一个if中有几百个这样或那样的语句”-这是一个真正的winYes…,是的,它会的。你可能会想一想你想做什么。我的意思是真的…一两个100或更多的?@user1721135:这取决于你为此付出了多少。如果低于5美元/小时-那么不在乎,他们(客户)值得一提的是,您可能需要100000项才能找到性能问题,但我敢打赌代码已经无法维护。如果性能是您唯一关心的问题,请运行代码并评估其行为。性能是唯一关心的问题。
-那么您就在浪费时间查看此问题。根据值的数量,设置em as键在性能方面可能更好。或者更好:$pages=array\u fill\u key(array('page1.htm','page2.htm'),true);
和如果(array\u key\u存在($page,$pages))
这仍然需要数百个硬编码的值。@MrCode,是的,确实需要,但是由于OP没有提到任何模式,我觉得如果有,就不安全了one@F4r-20尽管如此,这仍然不一定比OP当前的代码更出色,唯一的区别是可读性更强。OP说他只对性能感兴趣sumingpageX.html
不仅仅是一个示例,而且值实际上遵循一种模式,这是一个好主意。它只是一个示例,有很多不同的页面。一些页面具有模式,而另一些则不具有模式。数组填充键()
/数组键存在()
方法实际上比$cond | |$cond | |……
方法要昂贵得多,特别是当服务器使用操作码缓存时。file_exists()
方法是一种合理的方法,但是在像这样将任何使用输入应用到文件系统之前必须对其进行清理!basename()
通常是一个很好的开始。@DaveRandom:并不是说我不相信你或其他什么,但是你能解释一下为什么数组键存在和数组填充键
更贵吗?我意识到,如果在OP的例子中$page=='page1.htm'
,没有什么比这更好的了,这要感谢短路评估 array_fill_keys()
将对输入数组进行完整的迭代以生成输出数组(换句话说,它是O(n))。然后array_key_exists()
对该键进行哈希查找,以查看它是否存在,这可能会遇到哈希冲突,因此可能需要在内部进行进一步迭代。类似但更便宜的方法是在_数组中()
,因为这只是以类似于OP最初方法的短路方式运行第一个迭代步骤。如果将函数调用的内部处理开销和数组的内存开销考虑在内,这将非常昂贵。尽管如此,所有这一切都是最高阶次的微优化-它只会如果有效的可能匹配的数量在几万甚至几十万之间,则会产生有意义的差异。在我看来,实现这一点的最佳方法是可读性最高的方法和/或像file\u exists()
(或者更好的方法是,$page=\u DIR\u.'/'.pathinfo($page,pathinfo\u FILENAME)。'.htm';if(is\u file($page)){/*.*/}
)。新数组($no_of_pages);
不是PHP。此外,如果这是一种可行的方法,那么模式匹配从字符串中提取数字并检查其是否在范围内,对于如此多的可能输入将更加有效。in_Array()
与具有OR关系的一系列条件具有相同的短路求值行为。由于内部函数调用开销,它实际上可能比简单的if(…)
方法更昂贵。很抱歉。是的,我知道在_array()有相同的短路评估。我提到它只是因为OP似乎不知道。向下滚动到jari的答案…添加了一个示例来澄清,甚至更好的模式来捕获所有数字,而不受范围限制,不是吗?不是真的:开关($x){case$x>1:
只有在$x===true
的情况下才会发生,并且OP对Jari的建议进行了评论