ans*_*ung 5 php optimization drupal micro-optimization
在PHP switch语句中,将更常见的案例置于最高位置是否会提高性能?
例如,假设以下函数被调用1,000次:
<?php
function foo_user ($op) {
switch ($op) {
case 'after_update':
//Some Stuff
case 'login':
//Some other Stuff
}
}
Run Code Online (Sandbox Code Playgroud)
如果在函数被调用的1000次中的990中,$ op参数是'login',那么在语句中使用case: 'login'以上内容会改善性能吗?例如,如果传递了代码后会被忽略吗?case 'after_update':switchcase 'after_update':$op = login
我对这个想法进行了一些非正式的测试,但差别可以忽略不计 - 也许是因为代码之后case: 'login'并且case 'after_update':都是微不足道的.如果有人完全知道答案,我宁愿避免使用非平凡的操作设置更广泛的测试.
这特别是Drupal问题,但我想任何熟悉PHP优化的人都可以解决这个问题.
ale*_*lex 10
这很可能被称为微优化.我不相信会有很大的不同.
但是,如果您允许案例通过,例如,顺序对开关案例的逻辑意义重大
switch ($var) {
case 0:
case 1:
do_it();
break;
case 2:
do_it_else();
break;
}
Run Code Online (Sandbox Code Playgroud)
顺序很重要,案例将落实并执行任何代码,直到它中断.
除非你说100个可能的情况,否则我不会担心开关盒的速度.但如果那时,你可能应该重构你的代码.
你需要超过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");
Run Code Online (Sandbox Code Playgroud)
这是switch语句的1000万次执行.输出是:
Total time for argument abcdefg: 3.99799704552
Total time for argument hijklmno: 5.38317489624
Run Code Online (Sandbox Code Playgroud)
所以有一点不同,但是直到你达到1000万次执行的顺序才会引起注意,具体取决于你的处理器.