Percentis, e a cauda
A média esconde o que o usuário sente. P50, P95 e P99 com aquecimento separado — e por que o percentil sai da amostra, sem interpolar.
`Arcane.Bench` responde "quanto tempo leva" com uma média. É o que quase toda ferramenta de benchmark faz, e é onde quase toda decisão de performance erra.
Cem requisições de 10 ms e uma de 1000 ms dão média 20 ms. A pessoa que pegou a última esperou um segundo — e nenhum relatório baseado em média vai contar isso.
dataforge
adopt Arcane.Perfil as P
action consulta():
yield sum(range(400))
m := P.medir(consulta, {"amostras": 50, "aquecimento": 5})
assert m["amostras"] is 50
assert m["aquecimento"] is 5
assert m["p50"] smaller_eq m["p95"] and m["p95"] smaller_eq m["p99"]dataforge
adopt Arcane.Perfil as P
// quatro medidas normais e um pico: a media mal se move, o p99 salta
resumo := P.resumir([10.0, 10.0, 10.0, 10.0, 1000.0])
assert resumo["media"] smaller resumo["p99"]
assert resumo["max"] is 1000.0Duas decisões que mudam o número#
| Decisão | Por quê |
|---|---|
| o aquecimento é separado e declarado | as primeiras execuções medem cache frio, import preguiçoso e alocação inicial. Misturá-las com o resto não é medir o programa: é medir a partida |
| o percentil sai da amostra por posto, sem interpolar | interpolar inventa um valor que não aconteceu. Num P99 de latência o que se quer é uma medida que existiu |
| Número | Responde |
|---|---|
p50 | o caso comum |
p95, p99, p999 | o que o usuário reclama |
media e desvio | a forma da distribuição — e o aviso quando a média está bem acima da mediana |
vazao | operações por segundo, a partir da mediana |
min, max | o piso e o pior caso visto |