Php: Array_Search — Быстрый Поиск По Массиву

Функцию array_search() я использую для поиска значений в массиве довольно давно, так как неоднократно слышал и читал, что она работает заметно быстрее, чем поиск по массиву в цикле, но я не стал знать, насколько это быстрее.

Наконец-то дошли руки проверить и посчитать самому.

Я сравнил скорость поиска по массиву с помощью этой функции с обычным поиском по массиву в циклах foreach и while. На 10-100 элементах массива разница незаметна, а время настолько мало, что ею можно пренебречь.

Но для больших массивов разница оказалась весьма существенной.

Поскольку размер массива увеличился на порядок, время поиска также значительно увеличилось.

При ста тысячах элементов скорость foreach упала до 0,013 секунды, а while — до 0,017, при этом array_search() тоже замедлился, но всё равно остался на порядок быстрее — 0,004 секунды.

Для большого скрипта, работающего с большими массивами, замена поиска в цикле на поиск с использованием array_search() вообще не будет «блошиной оптимизацией».

UPD: добавил разрыв в циклы и изменил нужное значение, чтобы оно было в середине массива - 5-50-500 и т.д. Данные в таблице обновлены.

Количество элементов массива array_search цикл foreach пока цикл
10 0.0000068 0.0000064 0.0000076
100 0.0000078 0.0000153 0.0000185
1000 0.0000209 0.0001177 0.0001351
10000 0.0004210 0.0012128 0.0018670
100000 0.0039679 0.0130989 0.0175215
В связи с этим я вспомнил недавнюю дискуссию с одним из моих коллег по работе о том, нужно ли программисту знать все эти встроенные функции языка или достаточно «программистского мышления» и общих знаний.

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

UPD: нужен еще и склад ума программиста! И быть осторожным с памятью не помешает (навеяно брейком и диапазоном :) Ниже хака приведен код скрипта, который использовался для расчета времени: $масса=100000; // количество значений в массиве, в котором будем искать $поиск=50000; // будем искать это значение в массиве $first_result=массив(); // массив результатов для расчета среднего значения первого варианта $ Second_result = массив (); // массив результатов для расчета среднего значения второго варианта $ Third_result = массив (); // массив результатов для расчета среднего значения третьего варианта // создаем и заполняем массив $test_array = диапазон (0, $mass-1); // спасибо SelenIT )) /* $test_array=массив(); для ($i=0; $i<$mass; $i++) { $test_array[]=$i; } */ // цикл для расчета средних значений для ($d=0; $d<30; $d++) { //*************** Поиск с помощью array_search ******************* // Начинаем отсчет времени $time_start = микровремя (1); // поиск $key = array_search($search, $test_array, true); // если найден if ($key!==FALSE) // вам нужно !==, а не !=, потому что номер первого элемента равен 0 { эхо $test_array[$key]; } $time_end = микровремя (1); // окончание отсчета времени // записываем в массив значений $first_result[]= $time_end — $time_start; //*************** Поиск по массиву с помощью цикла foreach ******************* // Начинаем отсчет времени $time_start = микровремя (1); // сам поиск foreach ($test_array как $ta) { если ($ta==$search) { эхо $та; перерыв; } } $time_end = микровремя (1); // окончание отсчета времени // записываем в массив значений $секундный_результат[]= $time_end — $time_start; //*************** Поиск по массиву с помощью цикла while ******************* // Начинаем отсчет времени $time_start = микровремя (1); // определяем длину массива $count=count($test_array); $дж=0; // сам поиск пока ($j<$count) { if ($test_array[$j]==$search) // если найден { эхо $test_array[$j]; перерыв; } $дж++; } $time_end = микровремя (1); // окончание отсчета времени // записываем в массив значений $ Third_result[] = $time_end — $time_start; } $srednee1=array_sum($first_result)/count($first_result); $srednee2=array_sum ($ Second_result)/count ($ Second_result); $srednee3=array_sum ($ Third_result)/count ($ Third_result); printf('Первый код завершается в среднем за: %.

7f секунд', $srednee1); printf('Второй код завершается в среднем за: %.

7f секунд', $srednee2); printf('третий код завершается в среднем за: %.

7f секунд', $srednee3); // результат: // первый код завершается в среднем: 0,0000295 секунды // второй код завершается в среднем: 0,0153386 секунды // третий код завершается в среднем: 0,0226001 секунды Теги: #php #программирование #Чулан

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.