5

在 PHPswitch语句中,将更常见的情况放在顶部附近是否会提高性能?

例如,假设以下函数被调用 1,000 次:

<?php 
function foo_user ($op) {
    switch ($op) {
        case 'after_update':
        //Some Stuff
        case 'login':
        //Some other Stuff
    }
}

如果在 1,000 次中,有 990 次调用该函数,$op 参数是“登录”,那么在语句中添加case: 'login'上述参数会提高性能吗?例如,如果通过,后面的代码会被忽略吗?case 'after_update':switchcase 'after_update':$op = login

我已经对这个想法进行了一些非正式的测试,但差异可以忽略不计——可能是因为后面的代码case: 'login'和代码case 'after_update':都很简单。如果有人完全知道答案,我宁愿避免使用非平凡的操作设置更广泛的测试。

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

4

4 回答 4

10

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

但是,如果您允许案例失败,则顺序对 switch 案例的逻辑确实意义重大,例如

switch ($var) {

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

}

顺序很重要,案例将通过并执行任何代码,直到遇到中断。

我不会担心开关盒的速度,除非你说 100 种可能的情况。但是如果那样的话,你很可能应该重构你的代码。

于 2009-07-14T12:51:24.727 回答
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 万次执行之前,它不会很明显,这当然取决于您的处理器。

于 2009-07-14T13:03:23.357 回答
2

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

来自PHP.Net

switch 语句逐行执行(实际上是逐语句执行)。一开始,没有代码被执行。只有当 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";
    }
?>

不过,我会告诫不要依赖这种行为,并使用break;for each case,因为这将在您稍后重新访问代码时消除一些歧义。

于 2009-07-14T12:51:36.303 回答
0

通常,建议先写最可能的情况,然后再写第二个......

但就像亚历克斯写的,

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

于 2009-07-14T12:57:27.677 回答