Acessando Big Arrays em PHP

Eu tenho feito alguns perfis em diferentes métodos de acesso a grandes (ish) matrizes de dados em PHP. O caso de uso é bem simples: algumas de nossas ferramentas geram dados em arquivos PHP como matrizes associativas e esses arquivos são considerados dados estáticos pelo aplicativo. Criamos jogos, portanto, alguns exemplos de arquivos de dados incluiriam itens em um catálogo, tarefas que um usuário deve concluir ou definições para mapas:

<code><?php
$some_data = array(
    ...lots and lots of stuff in here...
);
?>
</code>

Como esses arrays são grandes-ish (400K), e grande parte do nosso código está interessado nesses dados, torna-se necessário acessar esses dados da forma mais eficiente possível. Eu estabeleci no tempo 3 padrões diferentes para fazer isso. Depois de apresentar os métodos, compartilharei meus resultados abaixo.

O que eu estou procurando é alguma validação baseada em experiência sobre esses métodos e seu tempo, bem como quaisquer outros métodos para experimentar.

Método 1: função getter

No método, o exportador realmente cria um arquivo que se parece com:

<code><?php
function getSomeData()
{
    $some_data = array(
        ...lots and lots of stuff here...
    );
    return $some_data;
}
?>
</code>

O código do cliente pode então obter os dados simplesmente chamando getSomeData () quando eles quiserem.

Método # 2: global + include

Neste método, o arquivo de dados parece idêntico ao bloco de código original acima, no entanto, o código do cliente deve passar por alguns aros para obter os dados em um escopo local. Isto assume que o array está em um arquivo chamado 'some_data.php';

<code>global $some_data; //must be the same name as the variable in the data file...
include 'some_data.php';
</code>

Isso trará a matriz $ some_data para o escopo, embora seja um pouco incômodo para o código do cliente (minha opinião).

Método # 3: getter por referência

Esse método é quase idêntico ao Método 1, mas a função getter não retorna um valor, mas define uma referência aos dados.

<code><?php
function getSomeDataByRef($some_data)
{
    $some_data = array(
        ...lots and lots of stuff here...
    );
    return $some_data;
}
?>
</code>

O código do cliente recupera os dados declarando uma variável local (chamada anything) e passando-a por referência ao getter:

<code>$some_data_anyname = array();
getSomeDataByRef(&$some_data_anyname);
</code>
Resultados

Então eu corri um pequeno script que executa cada um desses métodos de recuperar dados 1000 vezes e calcula a média do tempo de execução (calculado por microtime (true) no início e no fim). A seguir estão os meus resultados (em ms, rodando em um MacBook Pro de 2GHz, 8GB de RAM, PHP versão 5.3.4):

MÉTODO 1:

AVG: 0,0031637034416199 MÁX: 0,0043289661407471 MIN: 0,0025908946990967

MÉTODO # 2:

AVG: 0,01434082698822 MÁX: 0,018275022506714 MIN: 0,012722969055176

MÉTODO # 3:

AVG: 0.00335768699646 MAX: 0.0043489933013916 MIN: 0.0029017925262451

Parece bastante claro, a partir desses dados, que o método global + include é inferior aos outros dois, que são diferenças "insignificantes".

Pensamentos? Eu estou completamente perdendo alguma coisa? (provavelmente...)

Desde já, obrigado!

questionAnswers(2)

yourAnswerToTheQuestion