Доступ к большим массивам в PHP
Я занимался профилированием различных методов доступа к большим (ish) массивам данных в PHP. Вариант использования довольно прост: некоторые из наших инструментов выводят данные в файлы PHP в виде ассоциативных массивов, и эти файлы рассматриваются приложением как статические данные. Мы создаем игры, поэтому некоторые примеры файлов данных могут включать элементы в каталоге, задачи, которые пользователь должен выполнить, или определения для карт:
<code><?php $some_data = array( ...lots and lots of stuff in here... ); ?> </code>
Поскольку эти массивы имеют большой размер (400 КБ), и большая часть нашего кода заинтересована в этих данных, становится необходимым доступ к этим данным как можно более эффективно. Я остановился на 3 различных шаблонах для этого. После представления методов я поделюсь своими результатами ниже.
То, что я ищу, это некоторая основанная на опыте проверка этих методов и их времени, а также любых других методов, которые можно опробовать.
Метод № 1: функция полученияВ методе экспортер фактически создает файл, который выглядит следующим образом:
<code><?php function getSomeData() { $some_data = array( ...lots and lots of stuff here... ); return $some_data; } ?> </code>
Затем клиентский код может получить данные, просто вызвав getSomeData (), когда они этого захотят.
Способ № 2: глобальный + включитьВ этом методе файл данных выглядит идентично оригинальному блоку кода выше, однако клиентский код должен пройти через несколько циклов, чтобы получить данные в локальной области видимости. Это предполагает, что массив находится в файле с именем 'some_data.php';
<code>global $some_data; //must be the same name as the variable in the data file... include 'some_data.php'; </code>
Это перенесет массив $ some_data в область видимости, хотя это немного громоздко для клиентского кода (мое мнение).
Метод № 3: геттер по ссылкеЭтот метод практически идентичен методу № 1, однако функция-получатель не возвращает значение, а устанавливает ссылку на данные.
<code><?php function getSomeDataByRef($some_data) { $some_data = array( ...lots and lots of stuff here... ); return $some_data; } ?> </code>
Затем клиентский код извлекает данные, объявляя локальную переменную (называемую чем угодно) и передавая ее по ссылке получателю:
<code>$some_data_anyname = array(); getSomeDataByRef(&$some_data_anyname); </code>Результаты
Поэтому я запустил небольшой скрипт, который запускает каждый из этих методов получения данных 1000 раз и усредняет время выполнения (вычисляемое по микротайму (true) в начале и в конце). Ниже приведены мои результаты (в мс, работающие на MacBookPro 2 ГГц, 8 ГБ ОЗУ, PHP версии 5.3.4):
МЕТОД № 1:AVG: 0,0031637034416199 MAX: 0,0043289661407471 MIN: 0,0025908946990967
МЕТОД № 2:AVG: 0,01434082698822 MAX: 0,018275022506714 MIN: 0,012722969055176
МЕТОД № 3:AVG: 0,00335768699646 MAX: 0,0043489933013916 MIN: 0,0029017925262451
В любом случае, из этих данных кажется довольно ясным, что метод global + include уступает двум другим, которые являются «незначительной» разницей.
Мысли? Я что-то пропустил? (вероятно...)
Заранее спасибо!