Azimlib0.3.0 · documentation

Aceite local do passo 4 — 2026-10-03

Os itens 4.08–4.10 encerram o corte de desempenho com medições reproduzíveis, pixels preservados, input humano confirmado e limites explícitos. Não prometem FPS constantes, primeira vista instantânea ou desempenho igual ao Matplotlib em qualquer mapa. A validação das outras plataformas permanece no passo 5.

Base original, perfil e mudança

Foi usada a malha municipal original de São Paulo, IBGE 2024: 645 municípios, 892.336 posições, GeoJSON de 22.894.192 bytes. Todas as coordenadas XY fornecidas foram conservadas, sem simplificação. A conversão de desenvolvimento usa apenas a biblioteca padrão; não acrescenta leitura pública de Shapefile. Proveniência, hashes e CRS. O CRS original é SIRGAS 2000: não foi realizada transformação de datum para WGS84. É uma avaliação de visualização esférica, sem promessa de precisão cadastral. Os dados externos não são incluídos no wheel, sdist ou ZIP fonte.

O perfil da geometria original apontou cobertura de strokes/discos como maior gargalo: 82,3 s instrumentados em CoverageDraw.polygon, dentro de 106,0 s instrumentados. Esses valores de cProfile não são os tempos sem profiler da tabela abaixo. Resumo do perfil.

O extra accelerate compila os loops numéricos da Azimlib com Numba/NumPy genéricos. Não inclui outro renderer, Matplotlib, engine GIS, fastmath, redução de vértices ou cache persistente de código. Construção de segmentos, tracejados, discos, caps/joins e polígonos continua própria; a ordem das interseções e da soma de áreas é preservada. Sem o extra, permanece o caminho escalar Python/Pillow. O custo inicial do compilador está incluído nas medidas frias.

pip install "azimlib[gui,accelerate]"

Rasterização precisa e memória

Windows 11 build 26200, Ryzen 5 5600X (6 núcleos/12 threads), CPython 3.14.4, Pillow 12.3.0, NumPy 2.5.3, Numba 0.68.0, llvmlite 0.50.0. Figura 6,4×4,8 polegadas; além da malha original, mesh sintético 47×35 células, cinco níveis de contorno e 1.200 pontos determinísticos. Sem janela durante estes timings.

Vista / DPI Raster antes Raster atual Redução local Pico WSS antes → atual
Completa / 100 60,42 s 33,58 s 44,4% 320 → 433 MiB
Deslocada / 100 57,99 s 31,11 s 46,4% 321 → 434 MiB
Foco / 100 20,38 s 11,81 s 42,0% 267 → 354 MiB
Completa / 200 90,43 s 33,42 s 63,0% 487 → 559 MiB

Duas amostras em processos novos por configuração; mediana do raster e maior pico WSS observado. Os oito pares finais têm RGBA e PNG byte a byte idênticos. Não é inferência de significância estatística nem garantia em outra máquina. O custo de compilação/runtime aumenta memória: o commit privado chegou a cerca de 794 MiB no caso de 200 DPI. WSS/commit vêm de GetProcessMemoryInfo, não de tracemalloc; são valores do processo, com seus módulos e buffers, não só da imagem.

Os relatórios detailed-before-*-r*.json preservam o runtime anterior; detailed-final-*-r*.json medem o runtime atual. Os detailed-after-*-r*.json são uma etapa intermediária com limiar de compilação 256 e cache de 8 MiB, não o runtime final. Seus snapshots permanecem em tools/baselines. Auditoria consolidada confere hashes, origem dos módulos, input, pixels e memória sem repetir os timings.

Preparação de vistas novas, distinta do cache de imagens

O LRU de paths projetados passou de 8 para 16 MiB de payload, mantendo 1.024 entradas máximas. A malha original ocupa 14.455.285 bytes em 702 entradas: o orçamento anterior a expulsava durante cada percurso, provocando reprojeção completa em todo pan. Não se alteraram precisão float64 nem composição.

Composição Antes Atual
Primeira vista 9,01 s 8,52 s
Pan novo 9,09 s 0,41 s
Segundo pan novo 9,14 s 0,37 s
Retorno Home 8,31 s 0,38 s
Retorno ao pan 8,49 s 0,35 s

São vistas sucessivas reais no mesmo processo, sem cache de Scene ou imagem. Os cinco hashes da Scene, incluindo floats e estilos, coincidem antes/depois. Antes, atual. 16 MiB limitam o payload retido; não limitam a memória total. Outras bases maiores ainda podem expulsar entradas. A primeira preparação continua em segundos.

Janela visível e input humano

A verificação visual Windows cobriu Pan com saída/retorno, zoom, Home, Voltar/Avançar e fechamento, sem saltos ou mudança de espessura no exemplo Brasil. O escopo não inclui a base municipal pesada nem outras plataformas.

Telemetria final do Brasil: 1.606 eventos nativos, 26 press/release, dez wheel, três Home, 12 Back, quatro Forward e 246 registros de pintura idle do Tk. Handler máximo 31,1 ms; intervalo máximo do heartbeat 108,5 ms; idade estimada do despacho mediana 0 ms/máximo 63 ms, sujeita à granularidade do timer nativo. Entrega PhotoImage/canvas mediana 5,5 ms.

Para 31 eventos cuja vista exata foi entregue antes da próxima mudança de extent, input→idle teve mediana 210 ms, p95 551 ms e máximo 782 ms. Vistas intermediárias coalescidas não entram nessa amostra; uma revisita posterior não é contada como latência do evento antigo. Scene usa (west,south,east,north), enquanto Axes usa (west,east,south,north); a auditoria normaliza essa ordem. Idle do Tk não mede compositor, vsync ou apresentação física no monitor. O script preservado em tools/baselines/visible-navigation-human corresponde exatamente ao hash da sessão humana, anterior à opção de demonstração por API.

Na janela detalhada, duas mudanças pela API própria, pan novo e retorno Home, mediram entrega/pintura do Tk em canvas visível. Não houve input humano nessa sessão. A primeira preparação/raster levou cerca de 48 s antes de disponibilizar a janela; o pan novo estabilizou em 35,14 s e o retorno Home em 1,69 s usando o frame preciso armazenado. O maior intervalo do heartbeat foi 2,00 s. A primeira entrega ocorreu antes do canvas ficar mapeado; somente as mudanças seguintes têm canvas_viewable=true. Retorno de cache não representa velocidade da primeira rasterização.

O quadro preciso pesado permanece em worker próprio após navegação; sua conclusão leva dezenas de segundos, e composição/cópia ainda podem causar pausas. A abertura inicial é síncrona. O caso de 892 mil posições não tem aceite de pan contínuo fluido. Ele delimita o teto medido deste corte, sem bloquear o aceite do viewer Brasil nem esconder um gargalo futuro.

Não houve captura automática do desktop. Observação visual Windows e resultados da instrumentação são evidências separadas.

Reprodução e escopo do aceite

Na raiz do projeto, prepare a entrada externa uma vez e execute sem outras cargas pesadas concorrentes. A ferramenta de preparação baixa apenas a entrada oficial selecionada para o benchmark, verificando formato e hashes; ela não integra o runtime.

python tools/prepare_original_benchmark.py --help
python tools/benchmark_detailed_map.py caminho/ibge-sp-original-2024.geojson --output raster.json --warm
python tools/benchmark_new_views.py caminho/ibge-sp-original-2024.geojson --runtime src --output views.json
python tools/measure_visible_navigation.py --output native-input.json
python tools/audit_step4.py

O benchmark aceita --runtime para comparar snapshots próprios preservados, --view whole|pan|focus e --dpi 100|200; cProfile usa --profile em uma execução separada. Sem entrada externa, o auditor ainda confere os relatórios distribuídos. Não se impõe um teste de tempo frágil à suíte.

A suíte completa passou: 675 testes/22.192 subtests, em 187,385 s, com compilador opcional disponível. As seis novas regressões/5.470 subtests comparam bits de áreas/interseções, máscaras, linhas finas, acumulados, fallback e pixels com alpha/tracejados/buracos/recortes em duas resoluções; também permanecem os testes de cancelamento, processos de navegação e orçamento/cache existentes. Tempo de suíte não é benchmark de navegação. CI do extra foi configurada, mas não é declarada executada remotamente. Registro dos checks source/wheel: 39 testes selecionados com compilador e os mesmos 39 sem ele (dois checks exclusivos do compilador pulados), onze checks Tk de pan e 28 de toolbar em cada runtime; 114 exports estáticos iguais à distribuição anterior.

O aceite fecha evidência, melhoria e limites de 4.08–4.10. Abrange as bases e resoluções descritas, não novos formatos, datum cadastral, GPU, dados urbanos, 3D ou navegação fluida arbitrariamente densa. No encerramento deste lote havia sete subpassos do passo 5 pendentes, incluindo CI efetiva e verificações nas demais plataformas. A contagem atual está na checklist.