在PHP switch语句中,将更常见的情况放在最前面是否可以提高性能?
例如,假设下面的函数被调用了1000次:
<?php
function foo_user ($op) {
switch ($op) {
case 'after_update':
//Some Stuff
case 'login':
//Some other Stuff
}
}如果在函数被调用的1000次中的990次中,$op参数是'login',那么在switch语句中将case: 'login'设置为高于case 'after_update':会提高性能吗?例如,如果传递$op = login,case 'after_update':之后的代码会被忽略吗?
我已经对这个想法运行了一些非正式的测试,但差异可以忽略不计--可能是因为case: 'login'和case 'after_update':之后的代码都很琐碎。如果有人直接知道答案,我倾向于避免使用非平凡操作设置更广泛的测试。
这是一个明确的Drupal问题,但我想熟悉PHP优化的任何人都可以解决这个问题。
发布于 2009-07-14 12:51:25
这可能会被称为微优化。我不相信会有很大的不同。
但是,如果您允许案例失败,那么顺序对于切换案例的逻辑来说就意味着很多,例如
switch ($var) {
case 0:
case 1:
do_it();
break;
case 2:
do_it_else();
break;
}顺序很重要,案例将失败并执行任何代码,直到命中中断。
我不会担心开关情况的速度,除非你说有100个可能的情况。但是如果这样的话,很可能你应该重构你的代码。
发布于 2009-07-14 13:03:23
你需要1000多个案例才能注意到差异,但是的,确实存在差异。我写了一个测试:
function test_switch($value) {
$startTime = time() + microtime();
for ($i = 0; $i < 10000000; $i++) {
switch($value) {
case "abcdefg":
$j = $j + 1;
break;
case "hijklmno":
$j = $j + 1;
break;
}
}
$endTime = time() + microtime();
echo "Total time for argument $value: " . ($endTime - $startTime) . "<br>\n";
}
test_switch("abcdefg");
test_switch("hijklmno");也就是说,switch语句执行了1000万次。输出为:
Total time for argument abcdefg: 3.99799704552
Total time for argument hijklmno: 5.38317489624所以这是有区别的,但在达到1000万次执行之前,它不会很明显,当然,这取决于您的处理器。
发布于 2009-07-14 12:51:36
如果您不使用break;来结束每条语句,那么PHP会继续计算案例,直到switch块结束,这可能会影响足够大的块中的性能。然后,顺序对于获得您正在寻找的行为就变得很重要。
来自PHP.Net:
切换语句逐行执行(实际上是逐条语句执行)。在开始时,不执行任何代码。只有当发现case语句的值与switch表达式的值匹配时,PHP才开始执行这些语句。PHP继续执行这些语句,直到switch块结束,或者第一次看到break语句。如果您不在case的语句列表的末尾编写break语句,PHP将继续执行以下case的语句。例如:
<?php
switch ($i) {
case 0:
echo "i equals 0";
case 1:
echo "i equals 1";
case 2:
echo "i equals 2";
}
?>但是,我要告诫不要依赖这种行为,并对每个case使用break;,因为这将在以后重新访问代码时消除一些歧义。
https://stackoverflow.com/questions/1125139
复制相似问题