O mecanismo de modelo mais rápido para PHP

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/smarty
Placas: github.com/thephpleague/plates
Bigode: github.com/bobthecow/mustache.php
Twig: github.com/twigphp/Twig
Blade: github.com / jenssegers / blade
BladeOne: github.com/EFTEC/BladeOne
Latte: github.com/nette/latte

Se 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://comet:8080/php

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 :)

All Articles