案例的顺序在PHP switch语句中是否重要?

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个可能的情况,否则我不会担心开关盒的速度.但如果那时,你可能应该重构你的代码.


Mat*_*ges 6

你需要超过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万次执行的顺序才会引起注意,具体取决于你的处理器.