Pergunta

Uma pergunta sobre diferentes métodos de produzir html do PHP; quais são as diferenças de desempenho entre estes:

Método 1 - concatenação variável

$html = '';
$html .= '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html .= '<li> This is list item #'.$k.'</li>';
}
$html .= '</ul>';
echo $html;

Método 2 - buffer de saída

ob_start();
echo '<ul>';
for ($k = 1; $k < = 1000; $k++){
    echo '<li> This is list item #',$k,'</li>';
}
echo '</ul>';

Eu suspeito que você obter algum impacto na performance de continuamente modificando e ampliando uma variável; que é correto?

Felicidades!

Graças GaryF, mas eu não quero uma resposta sobre arquitetura - esta pergunta é sobre o desempenho. Parece haver algumas opiniões diferentes / testando sobre qual deles é mais rápido, razão pela qual não há uma resposta aceita ainda.

Foi útil?

Solução

É um pouco velho, mas este mensagem por Sara Golemon provavelmente ajuda. AFAIK a saída buffer funções são bastante rápido e eficiente e assim é echo, então é isso que eu usaria.

Outras dicas

A idéia de corda em si lado concatenação, você está realmente pedindo (eu acho) como deve ser a construção de páginas web, e parece-me que qualquer forma de concatentation explícita é provavelmente a coisa errada a fazer.

Tente utilizar o Model-View-Control padrão para construir seus dados e passá-la para uma biblioteca de templates simples (como Smarty ), e deixá-lo se preocupar sobre como construir a sua visão .

Melhor separação, menos preocupações.

Eu normalmente uso o método # 1 para que eu possa colocar esse HTML em qualquer lugar em um arquivo de modelo que contém HTML estático. Eu tento manter o máximo HMTL fora do meu PHP. Ele torna-se muito mais limpo e mais curto PHP, como o modelo é geralmente um arquivo separado.

Em relação velocidade / performance, eu estou pensando a diferença será muito menor. Com o buffer de saída, ele também está ampliando uma variável o tempo todo, embora essa variável não é acessível, mas tem que ser armazenados em algum lugar.

Muitas vezes me pergunto se aberto e <?php fechamento é mais lento do que simplesmente colocar tudo dentro <?php e depois echo'ing tudo de uma vez.

Eu acho que, no final, nós estamos falando milissegundos em scripts extremamente complexas.

Oh yeah, o método 1 é muito mais flexível, como você pode echo $html; em qualquer lugar.

É verdade que há uma ligeira sobrecarga nos constantemente modificando uma variável e reimpressão-la. No entanto, não fazendo isso significa que em algum momento o script pode concluir a execução (devido a uma interrupção ou similar), e as demonstrações de eco sequenciais terá parcialmente impressa na página em vez de nada.

Eu estava indo para escrever uma longa resposta sobre como cordas PHP são mutáveis ??(contrário de cordas imutáveis ??como em C ou C #), mas eu acho que eu vou apenas link para um posto mais velho me deparei com . Eu basicamente lida com o que você está pedindo, em relação à solução Java e C # de usar um stringbuilder.

sidenote: a solução stringbuilder seria semelhante ao (não testado):

$html = array();
$html[] = '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html[] = '<li> This is list item #';
    $html[] = $k;
    $html[] = '</li>';
}
$html[] = '</ul>';
echo implode('',$html);

Apenas um par de pensamentos:

  • buffer de saída pode torná-lo páginas olhar lento, desde que o usuário não vê nada até que todo o script foi executado (embora a forma como você tem # 1 configuração o mesmo seria verdadeiro).

  • Cordas em php são muteable, então concatenação não é quase tão ruim quanto em alguns outros idiomas. Dito isto, o buffer de saída pode ser apenas um pouco mais rápido, como o espaço alocado para a entrada é bastante grande por padrão (40K de acordo com este )

No final, eu diria que é muito mais uma questão de estilo. Se você gosta do que você compra o buffer de saída, então é provavelmente o caminho a percorrer.

As respostas para sua pergunta pode também ser encontrada aqui: php: saída [] w / juntar vs $ saída. =

A concatenação de string é o caminho mais rápido para construir cadeias.

Eu não testei "echo" vs edifício corda, mas contanto que você não está usando echo saída tamponado deve ser o mais rápido devido a gravações seqüenciais para um buffer de auto-nivelamento. (Sendo apenas desaceleração do flush, que você realmente não vai evitar até mesmo se você fizer cadeia de concatenação de antecedência)

Algo que eu não vi mencionado é que, geralmente, o cara PHP tem que trabalhar com design de pessoas que precisam de classe do HTML ou adicionar estilos de alguma outra maneira, então a solução deve ter isso em mente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top