Eustáquio Rangel

Desenvolvedor, pai, metalhead, ciclista

Pequena comparação

Publicado em Developer


Estava aqui fazendo um teste com arrays em PHP, depois que um sujeito me perguntou se o input do PHPReports não poderia ser um array ao invés de uma consulta ao banco de dados.

Eu respondi que para um relatório grande necessitaríamos de muita RAM para armazenar o dito cujo (deixo isso para outros programas que gostam de RAM por aí ;-), mas mesmo assim fiz alguns testes em relação à performance da coisa. "Caminhar" pelo array seria o melhor a fazer ali, mas em uma situação onde não se pudesse guardar a posição corrente, eu precisaria ir removendo os elementos do array, tão logo exibisse a linha de dados. Resolvi fazer um teste preenchendo o array, removendo seu elemento final usando pop, invertendo seus elementos e usando pop novamente (isso seria necessário para seguir a ordem do relatório, afinal, pop remove o último elemento, mas sem inverter iria imprimir o relatório de trás para frente) e finalmente usando shift (que remove o primeiro elemento, mas "empurra" todo o resto para baixo).

Fiz um teste com um array de 15000 elementos, aqui em um AMD Sempron 2500+. Preencher o array foi praticamente instantâneo, remover com pop, inverter e remover com pop também, mas usando shift levou 31 segundos.

Só por curiosidade resolvi fazer o mesmo teste em Ruby. Errr ... foi instantâneo. 0 segundos. Todos os testes. Resolvi aumentar o array para 150000 elementos (10x mais). 4 segundos. :-)

Discutindo um pouco com o pessoal (vejam bem, estávamos discutindo e conversando, ao contrário de muito sujeito que adora fazer flamewar com linguagens), a causa disso é por que todo array em PHP é um hash, como diz a sua documentação:
An array in PHP is actually an ordered map. A map is a type that maps values
to keys. 
This type is optimized in several ways, so you can use it as a real array, 
or a list (vector), hashtable (which is an implementation of a map), 
dictionary, collection, stack, queue and probably more. 
Because you can have another PHP array as a value, you can also quite 
easily simulate trees.
Fica bem prático, mas já deu para ver o preço que se paga na coisa. :-p

Atualizado em 25/05/2005 12:57 Xi, fiz barbeiragem. :-( Eu havia usado um shift no segundo teste, e não um pop. Usando pop a remoção dos elementos foi instântanea também. Mea culpa, já consertei o texto.


Comentários

Comentários fechados.

Sem nenhum comentário.

Artigos anteriores