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

时间:2009-07-14 12:46:00

标签: 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
    }
}

如果在函数被调用函数的1000次中的990次中,$ op参数为“login”,那么case: 'login'语句中case 'after_update':上的switch会提高性能吗?例如,如果传递了case 'after_update':,是否会忽略$op = login之后的代码?

我对这个想法进行了一些非正式测试,但差异可以忽略不计 - 也许是因为case: 'login'case 'after_update':之后的代码都是微不足道的。如果有人完全知道答案,我宁愿避免使用非平凡的操作进行更广泛的测试。

这特别是Drupal问题,但我想任何熟悉优化PHP的人都可以解决这个问题。

4 个答案:

答案 0 :(得分:10)

这很可能被称为微优化。我不相信会有很大的不同。

但是,如果你允许案件落空,那么顺序对开关案例的逻辑意味着很多,例如

switch ($var) {

    case 0:
    case 1:
       do_it();
       break;
    case 2:
       do_it_else();
       break;

}

顺序很重要,案例将落实并执行任何代码,直到它中断。

除非你说100个可能的情况,否则我不会担心开关盒的速度。但如果那时,你可能应该重构你的代码。

答案 1 :(得分: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");

这是switch语句的1000万次执行。输出是:

Total time for argument abcdefg: 3.99799704552
Total time for argument hijklmno: 5.38317489624

所以有一点不同,但是直到你达到1000万次执行的顺序才会引起注意,具体取决于你的处理器。

答案 2 :(得分:2)

如果不使用break;关闭每个语句,PHP将继续评估案例,直到switch块结束,这可能会影响足够大的块中的性能。然后,订单对于获取您正在寻找的行为非常重要。

来自PHP.Net

  

switch语句逐行执行(实际上是逐个语句)。一开始,没有代码被执行。只有当找到的case语句的值与switch表达式的值匹配时,PHP才会开始执行语句。 PHP继续执行语句,直到switch块结束,或者第一次看到break语句。如果你不在case语句列表的末尾写一个break语句,PHP将继续执行以下情况的语句。例如:

<?php
    switch ($i) {
        case 0:
            echo "i equals 0";
        case 1:
            echo "i equals 1";
        case 2:
            echo "i equals 2";
    }
?>

我会提醒您不要依赖此行为,并为每个break;使用case,因为这会在您稍后重新访问代码时消除一些歧义。

答案 3 :(得分:0)

通常,建议先编写最可能的案例,然后再编写第二个案例

但像Alex写的那样,

  

这可能会被称为a   微优化。我不相信   会有很大的不同。