Pular para o conteúdo

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.0

Duas decisões que mudam o número#

DecisãoPor quê
o aquecimento é separado e declaradoas 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 interpolarinterpolar inventa um valor que não aconteceu. Num P99 de latência o que se quer é uma medida que existiu
NúmeroResponde
p50o caso comum
p95, p99, p999o que o usuário reclama
media e desvioa forma da distribuição — e o aviso quando a média está bem acima da mediana
vazaooperações por segundo, a partir da mediana
min, maxo piso e o pior caso visto