代码之家  ›  专栏  ›  技术社区  ›  anschauung

在PHP switch语句中,案例的顺序重要吗?

  •  5
  • anschauung  · 技术社区  · 16 年前

    switch 陈述,将更常见的案例放在顶部附近是否会提高性能?

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

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

    case: 'login' 上方 case 'after_update': 开关 声明?例如,以下代码是否 案例“after_update”: $op = login 通过了?

    case:'登录' 案例“after_update”:

    4 回复  |  直到 16 年前
        1
  •  10
  •   alex    16 年前

    这可能被称为微观优化。我不认为会有很大的区别。

    然而,如果你允许这些案例失败,顺序对开关案例的逻辑确实意义重大,例如

    switch ($var) {
    
        case 0:
        case 1:
           do_it();
           break;
        case 2:
           do_it_else();
           break;
    
    }
    

    除非你说有100种可能的情况,否则我不会担心交换机的速度。但如果是这样,你很可能应该重构你的代码。

        2
  •  6
  •   Matt Bridges    16 年前

    你需要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");
    

    这相当于执行了1000万次switch语句。输出为:

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

    所以这是有区别的,但在你达到1000万次执行的数量级之前,它不会被注意到,当然这取决于你的处理器。

        3
  •  2
  •   Nick    16 年前

    如果你不使用 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";
        }
    ?>
    

    不过,我会提醒大家不要依赖这种行为,并使用 断裂; 对于每一个 case

        4
  •  0
  •   alex    16 年前

    通常,建议写最有可能的

    但正如亚历克斯所写,

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

    推荐文章