首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP switch语句中,case的顺序重要吗?

问在PHP switch语句中,case的顺序重要吗?
EN

Stack Overflow用户
提问于 2009-07-14 12:46:00
回答 4查看 2.2K关注 0票数 5

在PHP switch语句中,将更常见的情况放在最前面是否可以提高性能?

例如,假设下面的函数被调用了1000次:

代码语言:javascript
复制
<?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优化的任何人都可以解决这个问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-14 12:51:25

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

但是,如果您允许案例失败,那么顺序对于切换案例的逻辑来说就意味着很多,例如

代码语言:javascript
复制
switch ($var) {

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

}

顺序很重要,案例将失败并执行任何代码,直到命中中断。

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

票数 10
EN

Stack Overflow用户

发布于 2009-07-14 13:03:23

你需要1000多个案例才能注意到差异,但是的,确实存在差异。我写了一个测试:

代码语言:javascript
复制
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万次。输出为:

代码语言:javascript
复制
Total time for argument abcdefg: 3.99799704552
Total time for argument hijklmno: 5.38317489624

所以这是有区别的,但在达到1000万次执行之前,它不会很明显,当然,这取决于您的处理器。

票数 6
EN

Stack Overflow用户

发布于 2009-07-14 12:51:36

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

来自PHP.Net:

切换语句逐行执行(实际上是逐条语句执行)。在开始时,不执行任何代码。只有当发现case语句的值与switch表达式的值匹配时,PHP才开始执行这些语句。PHP继续执行这些语句,直到switch块结束,或者第一次看到break语句。如果您不在case的语句列表的末尾编写break语句,PHP将继续执行以下case的语句。例如:

代码语言:javascript
复制
<?php
    switch ($i) {
        case 0:
            echo "i equals 0";
        case 1:
            echo "i equals 1";
        case 2:
            echo "i equals 2";
    }
?>

但是,我要告诫不要依赖这种行为,并对每个case使用break;,因为这将在以后重新访问代码时消除一些歧义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1125139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档