Доступ к большим массивам в 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 уступает двум другим, которые являются «незначительной» разницей.

Мысли? Я что-то пропустил? (вероятно...)

Заранее спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос