You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Tudo aqui saiu de scripts/showdown.sh (cópia em codigo/showdown.sh). Nada foi
editado à mão. Cada tabela é uma execução própria do script; a máquina, a imagem
e o binário foram os mesmos em todas.
Procedência
CPU : 13th Gen Intel(R) Core(TM) i9-13900K
núcleos : 4 (limite do container)
PHP : 8.4.23
opcache : 8.4.23
imagem : debian 13.6 (php:8.4-cli + valgrind + opcache habilitado)
Rust : rust:1-bookworm, perfil `release` (lto=thin, codegen-units=1)
voltas : mínimo de 7 (15 no startup), braços em rodízio
data : 2026-07-30
Portão zero. Em toda tabela abaixo, os quatro braços imprimiram bytes
idênticos ao PHP 8.4 sem JIT antes de qualquer cronômetro. O script aborta sem
número se algum divergir.
Convenção da razão.razão = nosso ÷ oráculo, e o oráculo é o PHP 8.4 sem
JIT. Menor é melhor; 1,000× é paridade. A coluna × é a mesma conta
invertida, que é como se costuma ler de fora.
O binário de PGO foi treinado em 46 programas de benchmarks/{scalar-loop,array,call,expr-tree}/bench*.php.
benchmarks/upstream/ — que é onde o nbody mora — não alimentou o perfil.
1. Startup puro (arquivo <?php vazio), mínimo de 15
motor
ms
razão
Rype
2,6
0,237×
Rype + PGO
2,4
0,211×
PHP 8.4
11,1
1,000×
PHP 8.4 + JIT
12,9
1,158×
Serve de constante para descontar o custo de processo das tabelas seguintes.
2. nbody_canonical.php 1000000 — o programa do Benchmarks Game
motor
ms
razão
×
Rype
1513,1
1,458×
0,69×
Rype + PGO
1212,9
1,169×
0,86×
PHP 8.4
1037,5
1,000×
1,00×
PHP 8.4 + JIT
527,1
0,508×
1,97×
Descontado o startup: Rype 1,471× · PGO 1,179× · JIT 0,501×. Num programa de
1,5 s o startup não explica nada.
3. scalar-loop/bench.php — laço contado, 5.000.000 de voltas
motor
ms
razão
×
Rype
4,1
0,142×
7,07×
Rype + PGO
3,6
0,125×
8,02×
PHP 8.4
28,8
1,000×
1,00×
PHP 8.4 + JIT
18,5
0,641×
1,56×
Aqui o startup domina o número absoluto e desfavorece o Rype na leitura
crua. Descontado, a execução pura é 1,5 ms contra 17,7 ms — 0,085×, ou
11,8× mais rápido. É o único lugar deste documento em que o desconto muda a
conclusão, e por isso está declarado.
4. array/bench_awrite.php — escrita de elemento, 5.000.000 × 5
motor
ms
razão
×
Rype
65,5
0,647×
1,55×
Rype + PGO
64,1
0,634×
1,58×
PHP 8.4
101,2
1,000×
1,00×
PHP 8.4 + JIT
34,0
0,336×
2,98×
5. array/bench_awriteref.php — escrita através de referência
motor
ms
razão
×
Rype
76,8
0,717×
1,39×
Rype + PGO
81,1
0,758×
1,32×
PHP 8.4
107,1
1,000×
1,00×
PHP 8.4 + JIT
39,0
0,364×
2,75×
6. array/bench_arrayref.php — ligação de referência a elemento
motor
ms
razão
×
Rype
37,1
0,753×
1,33×
Rype + PGO
50,5
1,026×
0,97×
PHP 8.4
49,2
1,000×
1,00×
PHP 8.4 + JIT
36,6
0,744×
1,34×
O PGO piorou este. 0,753× → 1,026×. PGO não é ganho garantido: é ajuste de
layout e previsão de desvio, e o perfil que ajuda um caminho pode deslocar
outro. Fica registrado porque é justamente o tipo de número que some quando só
se publica a média.
7. call/bench_native.php — chamada de builtin, 3.000.000 de voltas
motor
ms
razão
×
Rype
84,8
1,846×
0,54×
Rype + PGO
51,1
1,111×
0,90×
PHP 8.4
45,9
1,000×
1,00×
PHP 8.4 + JIT
18,7
0,408×
2,45×
8. array/bench_foreachref.php — foreach por referência, 1.000.000 × 5
motor
ms
razão
×
Rype
146,0
2,027×
0,49×
Rype + PGO
98,4
1,367×
0,73×
PHP 8.4
72,0
1,000×
1,00×
PHP 8.4 + JIT
61,6
0,855×
1,17×
Quadro consolidado
Ordenado da melhor razão para a pior. É a tabela que importa, e a única que não
mente por seleção.
régua
Rype
Rype + PGO
PHP 8.4
PHP + JIT
scalar-loop/bench
0,142×
0,125×
1,000×
0,641×
startup (vazio)
0,237×
0,211×
1,000×
1,158×
bench_awrite
0,647×
0,634×
1,000×
0,336×
bench_awriteref
0,717×
0,758×
1,000×
0,364×
bench_arrayref
0,753×
1,026×
1,000×
0,744×
bench_native
1,846×
1,111×
1,000×
0,408×
bench_foreachref
2,027×
1,367×
1,000×
0,855×
nbody_canonical
1,458×
1,169×
1,000×
0,508×
O que estas medições não dizem
Nada sobre PHP de aplicação. Nenhum destes programas usa classe, string,
exceção, closure, autoload, I/O ou banco. Uma requisição de WordPress ou
Laravel não se parece com nenhuma linha aqui.
Nada sobre outra CPU. O container fixa PHP, glibc, rustc e flags. Não fixa
hardware. A razão transfere razoavelmente; o ms absoluto não transfere.
Nada sobre throughput multi-thread. Um processo por vez, quatro núcleos
disponíveis, nenhum deles usado em paralelo por ninguém.