Pular para o conteúdo

Observabilidade, memória e build: o mapa

Item por item das partes 17, 10 e 11 da referência Deep Tech — profiling, benchmarking, allocators, GC opcional, PGO e tooling.

Três partes de uma referência Deep Tech, cruzadas com o que a linguagem tem. Elas vão juntas porque se respondem: a parte 17 mede o que a parte 10 controla, e a parte 11 é quase toda ferramenta que já existia.

69 · Profiling (parte 17)#

ItemNo DataForgeOnde
CPU profilingdataforge profile e P.perfilar — tempo próprio por açãoChamadas
flame graphsP.chama_svg (SVG sem nada de fora) e P.chama_texto (formato dobrado)Chamadas
memory profilingMem.tamanho, Mem.layout, Mem.vivos por blueprintColetor
GC pausesP.gc_pausas — medido em gc.callbacks, na fonteChamadas
lock contentionP.trava — a thread bloqueada não gasta CPU, e não aparece num perfilChamadas
async task profilingL.estatisticas do laço: voltas, prazos, E/S e maior atrasoEscalonador
hardware counters, cache/branch missnão se aplica: o CPython não expõe contador de hardware, e a conta de cache de um interpretador de árvore diria pouco

70 · Benchmarking (parte 17)#

ItemNo DataForgeOnde
micro e macrobenchmarksArcane.Bench (curva, classe, comparar) e P.medirPerfil
P50, P95, P99P.medir e P.resumir, por posto e sem interpolarPerfil
tail latencyé o ponto da página: a média esconde exatamente issoPerfil
warm-upseparado e declarado em aquecimentoPerfil
statistical significanceMann-Whitney com correção de empates — e não teste t, porque tempo não é normalComparar
regression benchmarksP.guardar e P.conferir contra linha de base, com tolerânciaComparar
throughputvazao na medida, a partir da medianaPerfil

71 · Diagnóstico (parte 17)#

ItemNo DataForgeOnde
hotspot identificationo flame graph, por tempo próprioChamadas
GC pausesP.gc_pausas, com percentis e por geraçãoChamadas
lock contentionP.trava, com a taxa de disputaChamadas
scheduler overheadmaior_atraso_ms no laço de eventosEscalonador
I/O bottlenecks`Arcane.Observar` — painel, alerta e PrometheusObservar
compilation overhead`dataforge ir --fase=lir`Otimização
allocation hotspots, cache/branch missesnão existe: exigiria instrumentar o alocador do CPython

47–48 · Allocators e estratégias (parte 10)#

ItemNo DataForgeOnde
object pooling, memory reuseMem.arena, e o pool de `Arcane.Padroes`Coletor
arena lifetimeMem.limpar — o lote inteiro numa chamadaColetor
alignment controlexiste, e é real — mas só na fronteira com o C: C.alinhamento_deFFI
global/system/bump/slab/stack allocatornão se aplica: quem aloca é o CPython, e não há como trocá-lo por dentro. Um "allocator" em Python puro seria uma camada sobre o alocador real — mais lenta, e chamada de allocator por engano
stack vs heap allocationnão se aplica: todo objeto vive no heap do Python

49–51 · Zero-cost, bypass e GC (parte 10)#

ItemNo DataForgeOnde
desativação local do GCMem.sem_gc, que religa mesmo se o corpo falharColetor
pause timesP.gc_pausas, com P50/P95/P99Chamadas
allocation thresholdsMem.gc_limiares — os três, lidos e ajustadosColetor
generational GCas três gerações do CPython, com a conta por geraçãoColetor
interação entre GC e ownership`Arcane.Posse` libera por escopo, sem esperar coletorPosse
escape analysis, dead code eliminationexistem, e são do analisadorAnálises
mark-and-sweep, concurrent/parallel GC, thread-local GCnão se aplica: o coletor é o do CPython, e trocá-lo não é uma decisão desta linguagem
monomorfização, static dispatch, inline expansionnão existe: a linguagem é dinâmica, e uma ação pode ser substituída em execução
#[no_std], bypass do runtimenão se aplica: o runtime é o CPython

52–54 · Build (parte 11)#

ItemNo DataForgeOnde
compiler toolingjá existia inteiro: check, fmt, lint, test, bench, profile, debug, dap, lsp, doc, cobertura, --plugin=CLI
dfpm (gerenciador)dataforge add/install/pack/publish, com semver e lockfilePacotes
code coveragedataforge test --cobertura --minimo=80Cobertura
compiler plugins--plugin=, escrito em DataForge, vendo MIR e SSAPlugins
PGOnão se aplica, e há número: a parte 8 mediu que compilar mais nós rende 1,01× em código real. Um PGO que decidisse o que compilar otimizaria a constante erradaOtimização
LTO, ThinLTO, cross-module inliningnão se aplica: não há passo de ligação

O resumo honesto#

A parte 17 rendeu inteira — percentis, significância, regressão, flame graph, pausas do coletor e contenção eram todos buracos reais, e todos transferem sem hardware. A parte 10 rendeu pela metade: o coletor e a arena sim; allocator, no_std e monomorfização não, porque quem aloca é o CPython. A parte 11 já estava quase toda pronta — §54 existia por inteiro —, e o que sobrava (PGO, LTO) é onde a parte 8 já tinha dado a resposta com número.