Подтвердить что ты не робот

В PHP, что быстрее, большой оператор Switch или поиск в массиве Array

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

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

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

4b9b3361

Ответ 1

Проделали некоторые тесты:

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%

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

Ответ 2

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