Observabilidade e memória
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.
Item No DataForge Onde CPU profiling dataforge profile e P.perfilar — tempo próprio por açãoChamadas flame graphs P.chama_svg (SVG sem nada de fora) e P.chama_texto (formato dobrado)Chamadas memory profiling Mem.tamanho, Mem.layout, Mem.vivos por blueprintColetor GC pauses P.gc_pausas — medido em gc.callbacks, na fonteChamadas lock contention P.trava — a thread bloqueada não gasta CPU, e não aparece num perfilChamadas async task profiling L.estatisticas do laço: voltas, prazos, E/S e maior atraso Escalonador hardware counters, cache/branch miss não se aplica : o CPython não expõe contador de hardware, e a conta de cache de um interpretador de árvore diria pouco—
Item No DataForge Onde micro e macrobenchmarks Arcane.Bench (curva, classe, comparar) e P.medirPerfil P50, P95, P99 P.medir e P.resumir, por posto e sem interpolarPerfil tail latency é o ponto da página: a média esconde exatamente isso Perfil warm-up separado e declarado em aquecimento Perfil statistical significance Mann-Whitney com correção de empates — e não teste t, porque tempo não é normal Comparar regression benchmarks P.guardar e P.conferir contra linha de base, com tolerânciaComparar throughput vazao na medida, a partir da medianaPerfil
Item No DataForge Onde hotspot identification o flame graph, por tempo próprio Chamadas GC pauses P.gc_pausas, com percentis e por geraçãoChamadas lock contention P.trava, com a taxa de disputaChamadas scheduler overhead maior_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 misses não existe : exigiria instrumentar o alocador do CPython—
Item No DataForge Onde object pooling, memory reuse Mem.arena, e o pool de `Arcane.Padroes` Coletor arena lifetime Mem.limpar — o lote inteiro numa chamadaColetor alignment control existe, e é real — mas só na fronteira com o C: C.alinhamento_de FFI global/system/bump/slab/stack allocator nã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 allocation não se aplica : todo objeto vive no heap do Python—
Item No DataForge Onde desativação local do GC Mem.sem_gc, que religa mesmo se o corpo falhar Coletor pause times P.gc_pausas, com P50/P95/P99Chamadas allocation thresholds Mem.gc_limiares — os três, lidos e ajustadosColetor generational GC as três gerações do CPython, com a conta por geração Coletor interação entre GC e ownership `Arcane.Posse` libera por escopo, sem esperar coletorPosse escape analysis, dead code elimination existem, e são do analisador Análises mark-and-sweep, concurrent/parallel GC, thread-local GC não se aplica : o coletor é o do CPython, e trocá-lo não é uma decisão desta linguagem— monomorfização, static dispatch, inline expansion nã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—
Item No DataForge Onde compiler tooling já 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 coverage dataforge test --cobertura --minimo=80Cobertura compiler plugins --plugin=, escrito em DataForge, vendo MIR e SSAPlugins PGO nã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 inlining não se aplica : não há passo de ligação—
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.
O teste que mais importa deste conjunto
Não é nenhum dos números: é o que compara uma ação com ela mesma e exige a resposta "empate". Uma ferramenta de benchmark que responde "3% mais rápida" a isso é pior que nenhuma ferramenta — porque é assim que se escolhe a implementação errada com convicção.
Anterior
← O coletor sob controle
Próximo
Antes da primeira linha →