В PHP что происходит быстрее, делая большой оператор switch или настраивая массив и просматривая ключ?
Теперь, прежде чем вы ответите, мне хорошо известно, что для чистого поиска массив работает быстрее. Но это предполагает создание массива только один раз, а затем поиск его повторно.
Но это не то, что я делаю – каждый прогон кода является новым, массив будет использоваться один раз каждый раз. Таким образом, все хеши массива должны быть подсчитаны каждый раз, и мне интересно, работает ли эта установка медленнее, чем просто с помощью оператора switch.
Проделали некоторые тесты:
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, 3 комбинации букв.
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%
Метод массива выигрывает каждый раз, даже когда вы включаете время настройки. Но не много. Поэтому я думаю, что проигнорирую эту оптимизацию и займусь тем, что проще.
Это зависит от размера массива, но для большинства практических целей вы можете считать, что массив работает быстрее. Причина проста; оператор switch должен последовательно сравнивать каждую запись в инструкции switch, но подход массива просто берет хэш и находит эту запись. Когда у вас так мало записей в коммутаторе, что последовательные сравнения быстрее, чем хеширование, быстрее использовать переключатель, но подход массива становится более эффективным быстро. В терминах компьютерной науки речь идет о O (n) и O (1).