Порядок случаев имеет значение в операторах переключения PHP?

На основе версии ilius, но с текущей ветвью, отмеченной звездочкой и цветом, и показывающей только то, что не описано как «месяцы» или «годы» назад:

current_branch="$(git symbolic-ref --short -q HEAD)"
git for-each-ref --sort=committerdate refs/heads \
  --format='%(refname:short)|%(committerdate:relative)' \
  | grep -v '\(year\|month\)s\? ago' \
  | while IFS='|' read branch date
    do
      start='  '
      end=''
      if [[ $branch = $current_branch ]]; then
        start='* \e[32m'
        end='\e[0m'
      fi
      printf "$start%-30s %s$end\\n" "$branch" "$date"
    done
5
задан Rich Adams 14 July 2009 в 13:03
поделиться

4 ответа

Это, вероятно, будет называться микрооптимизацией. Я не верю, что будет большая разница.

Однако порядок имеет большое значение для логики корпуса переключателя, если вы позволяете корпусам проваливаться, например

switch ($var) {

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

}

Порядок важен, корпус будет провалиться и выполнить любой код до тех пор, пока он не перестанет работать.

Я бы не стал беспокоиться о скорости переключателя, если вы не сказали 100 возможных случаев. Но если тогда, скорее всего, вам следует провести рефакторинг своего кода.

Не беспокойтесь о скорости корпуса переключателя, если только вы не сказали 100 возможных случаев. Но если тогда, скорее всего, вам следует провести рефакторинг своего кода.

Не беспокойтесь о скорости корпуса переключателя, если только вы не сказали 100 возможных случаев. Но если тогда, скорее всего, вам следует провести рефакторинг своего кода.

10
ответ дан 18 December 2019 в 09:09
поделиться

Чтобы заметить разницу, вам понадобится намного больше 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");

Это 10 миллионов запусков оператора switch. Результат:

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

Значит, разница есть, но она не будет заметна, пока вы не достигнете порядка 10 миллионов выполнений, конечно, в зависимости от вашего процессора.

6
ответ дан 18 December 2019 в 09:09
поделиться

Если вы не используете break; для закрытия каждого оператора, PHP продолжит оценивать случаи до конца блока switch , что может повлиять на производительность в достаточно большом блоке. Тогда порядок становится важным для получения желаемого поведения.

Из PHP.Net :

Оператор switch выполняется строка за строкой (фактически, оператор за оператором). Вначале код не выполняется. Только когда оператор case найден со значением, которое соответствует значению выражения switch, PHP начинает выполнять операторы. PHP продолжает выполнять операторы до конца блока switch или до первого появления оператора break. Если вы не пишете оператор break в конце списка операторов case, PHP продолжит выполнение операторов следующего случая. Например:

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

Я бы предостерегал от такого поведения и использовал break; для каждого case , поскольку это устранит некоторую двусмысленность, когда вы вернетесь к коду позже.

2
ответ дан 18 December 2019 в 09:09
поделиться

Обычно рекомендуется записывать сначала наиболее вероятный случай , затем второй ...

но, как писал Алекс,

называться микрооптимизация. Я не верю будет большая разница.

0
ответ дан 18 December 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: