В PHP что быстрее, большой оператор Switch или поиск по ключу массива - PullRequest
25 голосов
/ 28 июля 2011

В PHP что быстрее, сделать большой оператор switch или настроить массив и найти ключ?

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

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

Ответы [ 2 ]

13 голосов
/ 31 июля 2011

сделал несколько тестов:

array_gen.php:

<?
echo '<?
$a = 432;
$hash = array(
';
for($i = 0; $i < 10000; $i++) echo "$i => $i,\n";
echo ');
echo $hash[$a];
';

switch_gen.php:

<?
echo '<?
$a = 432;
switch($a) {
';
for($i = 0; $i < 10000; $i++) echo "case $i: echo $i; break;\n";
echo '}';

Тогда:

php array_gen.php > array_.php
php switch_gen.php > switch.php

time tcsh -c 'repeat 1000 php array.php > /dev/null'
19.297u 4.791s 0:25.16 95.7%
time tcsh -c 'repeat 1000 php switch.php > /dev/null'
25.081u 5.543s 0:31.66 96.7%

Затем я изменил цикл:

for($i = 'a'; $i < 'z'; $i++)
  for($j = 'a'; $j < 'z'; $j++)
    for($k = 'a'; $k < 'z'; $k++)

Для создания 17576 трехбуквенных комбинаций.

time tcsh -c 'repeat 1000 php array.php > /dev/null'
30.916u 5.831s 0:37.85 97.0%
time tcsh -c 'repeat 1000 php switch.php > /dev/null'
36.257u 6.624s 0:43.96 97.5%

Метод массива выигрывает каждый раз, даже если вы включили время установки. Но не очень. Поэтому я думаю, что проигнорирую эту оптимизацию и пойду с тем, что проще.

6 голосов
/ 28 июля 2011

Это зависит от размера массива, но для большинства практических целей вы можете считать, что массив быстрее.Причина проста;оператор switch должен сравниваться последовательно с каждой записью в операторе switch, но подход с использованием массива просто берет хеш и находит эту запись.Когда в вашем коммутаторе так мало записей, что последовательные сравнения выполняются быстрее, чем хэширование, использование коммутатора происходит быстрее, но подход с использованием массива становится более эффективным.С точки зрения информатики, это вопрос O (n) против O (1).

...