Что быстрее, поиск массива (включая сборку массива) или стек IF? - PullRequest
1 голос
/ 05 декабря 2008

Мне было интересно, что было лучше:

$lookup = array( "a" => 1, "b" => 2, "c" => 3 );
return $lookup[$key];

или

if ( $key == "a" ) return 1
else if ( $key == "b" ) return 2
else if ( $key == "c" ) return 3

или, может быть, просто хороший выключатель ...

switch($key){
case "a": return 1;
case "b": return 2;
case "c": return 3;
}

Я всегда предпочитаю первый метод, поскольку я могу отделить данные от кода; В этом масштабе это выглядит довольно глупо, но в большем масштабе с тысячами строк поиска записей; Сколько еще времени PHP займет на создание массива, а затем проверяет только 1 или 2 записи на запрос.

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

PHP должен иметь возможность обрабатывать запросы быстрее, чем я в PHP-коде, но, прежде всего, сборка массива занимает много времени.

Ответы [ 8 ]

6 голосов
/ 05 декабря 2008

Для всего с измеряемой производительностью (не только 3 записи) поиск является самым быстрым способом. Вот для чего нужны хеш-таблицы.

3 голосов
/ 05 декабря 2008

Во-первых, это легко проверить самостоятельно.

Во-вторых, и, что более важно, что наиболее подходит для кода, который вы используете? Количество времени, которое вы сэкономите, в любом случае незначительно.

2 голосов
/ 05 декабря 2008

Будет переломный момент, который вам нужно будет просто проверить, чтобы найти его. Я предполагаю, что с 3 предметами лучше, если / тогда / еще. Это хорошая статья о подсчете битов, в которой сравнивается вычисление количества бит и использование поисков. Спойлер: Поиски выиграны!

1 голос
/ 05 декабря 2008

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

emptyfunction:  0.00000087601416110992430969503855231472755349386716
lookuparray:    0.00000136602194309234629100648257538086483009465155
makearrayonly:  0.00000156002373695373539708814922266633118397294311
makearray:      0.00000174602739810943597796187489595842734502184612
ifblock:        0.00000127001986503601083772739543942265072473674081
switchblock:    0.00000131001937389373773757957151314679222764425504

Каждый был внутри метода, поэтому я также включил время для пустого метода. Их запускали 1 000 000 раз каждый, а затем усредняли.

Просто выполнение поиска (без построения массива) на самом деле медленнее, чем блок if (использует глобальный поиск так же, как мой код), и лишь на долю медленнее, чем блок переключателя.

Меня не беспокоит масштабирование этого до сотен операторов if, но это просто показывает, что оператор if быстрее даже на этом уровне по сравнению с одним поиском.

1 голос
/ 05 декабря 2008

Собираете ли вы массив каждый раз, или вы можете собрать его один раз и кэшировать?

Если вы создаете его каждый раз, я не понимаю, как это может быть быстрее. Построение массива само по себе должно занять больше времени, чем цепочка if () s (Добавление одного элемента в массив будет по времени близко к одному if (), но вам придется добавить каждый элемент, когда вы можете выйти из if () рано)

Если вы можете использовать кэшированный массив, то, я думаю, это будет явным победителем.

0 голосов
/ 05 декабря 2008

Это небольшой тест для манипуляций с массивами

{
    $x = 0;
    foreach ($test as $k => $v) {
        $x = sprintf(” % s=>%sn”,$k,$v);}
}
{
    $x = 0;
    reset($test);
    while (list($k, $v) = each($test)) {
        $x = sprintf(” % s=>%sn”,$k,$v);
     }
}
{
    $x = 0;
    $k = array_keys($test);
    $co = sizeof($k);
    for ($it = 0; $it < $co; $it++) {
        $x = sprintf(” % s=>%sn”,$k[$it],$test[$k[$it]]);
     }
}
{
    $x = 0;
    reset($test);
    while ($k = key($test)) {
        $x = sprintf(” % s=>%sn”,$k,current($test)); next($test);
     }
}

время доступа (мс)
8,1222
10,3221
9,7921
8,9711

0 голосов
/ 05 декабря 2008

Вы можете проверить, сколько времени потребуется, чтобы увидеть, что значение также отсутствует. Я предполагаю, что поиск ключа массива будет быстрее. И если вам придется запрашивать его дважды или более, кэширование массива должно ускорить его.

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

  • Если вы просто хотите посмотреть значение вы используете массив.
  • Если вы хотите принять меры, то if и switch имеют свое применение.
0 голосов
/ 05 декабря 2008

Если у вас есть тысячи записей, поиск по массиву выиграет. Ассоциативный массив может быть немного медленным, но поиск ключа массива намного быстрее, чем выполнение тысяч if() блоков (не говоря уже о времени, которое требуется для его распечатывания!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...