Escolhendo um mecanismo de modelo para o projeto Comet , decidi comparar todos os mecanismos populares na comunidade PHP. Normalmente, essa escolha é ditada pela estrutura: o sinfonista envolverá os modelos no Twig, o programador do Laravel se armará com o Blade. Mas eu estava interessado na pergunta - como essas opções diferem em termos de desempenho? Depois de testar sete mecanismos e PHP puro, recebi uma resposta. Dados, horários, campeões e perdedores - sob o corte!
Ele lembrou os nomes dos principais candidatos, encontrou o resto, armado com estatísticas do GitHub e discussões no Reddit. Aqui está a lista:Smarty: github.com/smarty-php/smartyPlacas: github.com/thephpleague/platesBigode: github.com/bobthecow/mustache.phpTwig: github.com/twigphp/TwigBlade: github.com / jenssegers / bladeBladeOne: github.com/EFTEC/BladeOneLatte: github.com/nette/latteSe você conhece uma opção interessante - escreva, adicionarei ao teste. O Blade está profundamente integrado ao Laravel, então tive que fazer algumas de suas implementações independentes. Infelizmente, nenhum deles suporta componentes Blade-X.Para entender a essência do benchmark, a maneira mais fácil é olhar a versão do código com PHP puro:$data = [
(object) [
"code" => 200,
"message" => "OK"
],
(object) [
"code" => 404,
"message" => "Not Found"
],
(object) [
"code" => 500,
"message" => "Internal Server Error"
],
];
$html = '<html><head></head><body>';
foreach ($data as $message) {
$html .= "<p>$message->code : $message->message</p>";
}
$html .= '</body></html>';
Este é um teste sintético para gerar uma matriz de três objetos em um modelo HTML contendo duas propriedades: código HTML e uma breve descrição dele.É assim que o analógico do Twig se parece:<html><head></head><body>
{% for message in data %}
<p>{{ message.code }} : {{ message.message }}</p>
{% endfor %}
</body></html>
E este é o Blade:<html><head></head><body>
@foreach ($data as $message)
<p>{{ $message->code }} : {{ $message->message }}</p>
@endforeach
</body></html>
Os testes foram executados no contêiner Ubuntu 20.04 / PHP 7.4 / Comet 0.6 em uma máquina virtual com 4 núcleos Ryzen 3600 e memória 4G:wrk --connections=500 --threads=2 --duration=10s http:
Essa situação acabou, cada gráfico reflete o número médio de solicitações concluídas com êxito em um segundo:
PHP puro - esperado primeiro, mas inesperadamente, que o Blade já esteja com metade do atraso! E por que as placas “leves” ficam para trás do “poderoso” Twig? Todas as estruturas usam cache regular, portanto, os resultados são o mais próximo possível dos reais.Na estrutura de um artigo, eu não queria sobrecarregar o leitor com uma análise estendida do código, estratégias de trabalho e armazenamento em cache de mecanismos, análise de critérios para escolher um mecanismo de modelo que é importante para mim. Se o tópico for interessante - vou escrever uma sequela.Como um anúncio: olhe para o Comet , em um futuro próximo - faça dele o framework PHP mais rápido e mais conveniente para criar APIs e microsserviços tranquilos :)