Antes de tudo, entendo que em 90% dos aplicativos a diferença de desempenho é completamente irrelevante, mas só preciso saber qual é a construção mais rápida. Isso e ...
As informações atualmente disponíveis na rede são confusas. Muitas pessoas dizem que foreach é ruim, mas tecnicamente deve ser mais rápido, pois é suposto simplificar a gravação de uma passagem de array usando iteradores. Iteradores, que novamente são mais rápidos, mas no PHP também são aparentemente muito lentos (ou isso não é algo do PHP?). Eu estou falando sobre as funções da matriz: next () prev () reset () etc., bem, se elas são funções pares e não um daqueles recursos da linguagem PHP que se parecem com funções.
Para restringir um pouco isso : não sou interessante em percorrer matrizes em etapas com nada mais que 1 (nenhuma etapa negativa também, isto é, iteração reversa). Também não estou interessado em uma travessia de e para pontos arbitrários, apenas 0 no comprimento. Também não vejo manipular matrizes com mais de 1000 chaves acontecendo regularmente, mas vejo uma matriz sendo percorrida várias vezes na lógica de um aplicativo! Também quanto às operações, em grande parte apenas manipulação e eco de cordas.
Aqui estão alguns sites de referência:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
O que eu ouço em todos os lugares:
foreach
é lento e, portanto,for
/while
é mais rápido- PHPs
foreach
copia a matriz que itera; para torná-lo mais rápido, você precisa usar referências - código como este: é mais rápido que um
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
Aqui está o meu problema. Eu escrevi este script de teste: http://pastebin.com/1ZgK07US e não importa quantas vezes eu execute o script, recebo algo assim:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
Em resumo:
foreach
é mais rápido do queforeach
com referênciaforeach
é mais rápido quefor
foreach
é mais rápido do quefor
para uma tabela de hash
Alguém pode explicar?
- Estou fazendo algo errado?
- A coisa de referência do PHP foreach está realmente fazendo a diferença? Quero dizer, por que não copiá-lo se você passar por referência?
- Qual é o código do iterador equivalente para a instrução foreach; Já vi alguns na rede, mas cada vez que os teste, o tempo está muito longe; Também testei algumas construções simples de iteradores, mas nunca obtive resultados decentes - os iteradores de matriz no PHP são terríveis?
- Existem maneiras / métodos / construções mais rápidos para iterar por uma matriz diferente de FOR / FOREACH (e WHILE)?
Versão do PHP 5.3.0
Edit: Answer Com a ajuda de pessoas daqui, pude reunir as respostas para todas as perguntas. Vou resumir aqui:
- "Estou fazendo algo errado?" O consenso parece ser: sim, não posso usar eco em benchmarks. Pessoalmente, ainda não vejo como o eco é alguma função com tempo aleatório de execução ou como qualquer outra função é de alguma forma diferente - isso e a capacidade desse script de gerar apenas os mesmos resultados exatos do foreach melhor do que tudo é difícil para explicar, embora apenas "você esteja usando eco" (bem, o que eu deveria estar usando). No entanto, admito que o teste deve ser feito com algo melhor; embora um compromisso ideal não venha à mente.
- "O PHP para cada coisa de referência está realmente fazendo a diferença? Quero dizer, por que não copiá-lo se você passar por referência?" O ircmaxell mostra que sim, mais testes parecem provar na maioria dos casos que a referência deve ser mais rápida - embora, dado o meu trecho de código acima, definitivamente não signifique tudo. Eu aceito que o problema provavelmente não seja intuitivo demais para se preocupar com esse nível e exigiria algo extremo, como descompilar, para realmente determinar qual é o melhor para cada situação.
- "Qual é o código do iterador equivalente para a instrução foreach; eu vi alguns na rede, mas cada vez que os testo, o tempo está muito distante; eu também testei algumas construções simples do iterador, mas nunca obtive resultados decentes - os iteradores de array no PHP são péssimos? " a ircmaxell forneceu a resposta abaixo; embora o código possa ser válido apenas para a versão PHP> = 5
- "Existem maneiras / métodos / construções mais rápidos para iterar através de uma matriz diferente de FOR / FOREACH (e WHILE)?" Agradecemos a Gordon pela resposta. O uso de novos tipos de dados no PHP5 deve oferecer um aumento no desempenho ou na memória (um dos quais pode ser desejável dependendo da sua situação). Embora em termos de velocidade muitos dos novos tipos de array não pareçam melhores que array (), a fila de prioridade e o armazenamento de objetos de paródia parecem ser substancialmente mais rápidos. Link fornecido por Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Obrigado a todos que tentaram ajudar.
Provavelmente vou me ater ao foreach (a versão sem referência) para qualquer passagem simples.