Skip to content

chore(benchmarks): runners em bash para Linux/macOS e primeiro cross-runtime em Ubuntu - #141

Merged
estevaofon merged 2 commits into
developfrom
chore/bench-runners-bash
Sep 5, 2026
Merged

chore(benchmarks): runners em bash para Linux/macOS e primeiro cross-runtime em Ubuntu#141
estevaofon merged 2 commits into
developfrom
chore/bench-runners-bash

Conversation

@estevaofon

@estevaofon estevaofon commented Sep 5, 2026

Copy link
Copy Markdown
Owner

O quê

Os runners de benchmark do repo eram só PowerShell; numa instalação limpa de Ubuntu sem pwsh não dava para reproduzir nada. Este PR adiciona os mesmos três runners em bash, com o mesmo protocolo e a mesma saída, registra a primeira medição do cross-runtime em Linux e conserta os três benches da suíte que não entravam nos runners.

  • benchmarks/run_benchmarks.sh — suíte completa por binário, mediana de N, grava results/<label>.md.
  • benchmarks/interleaved_compare.sh — dois binários intercalados na mesma janela, guard de CHECKSUM, benches sem equivalência pulados e listados, grava results/interleaved.md.
  • benchmarks/cross_runtime/run_cross_runtime.sh — Noxy × CPython × Lua × Go, mínimo de N, --noxy-baseline como coluna extra na mesma janela, tabela líquida e razões, grava results/cross_runtime.md.
  • benchmarks/cross_runtime/results/2026-09-05-v0250-ubuntu.md — v0.25.0 em Ubuntu 26.04 (CPython 3.14.4 do pacote, Go 1.27.1), duas rodadas de 9.
  • Docs: cross_runtime/README.md, seção Reprodução do RESULTS.md e a linha de benchmarks do AGENTS.md.

Diferenças deliberadas em relação aos .ps1:

  • Flags GNU (--noxy, --runs) em vez de parâmetros PowerShell.
  • Números com ponto decimal fixo (LC_NUMERIC=C) independente do locale.
  • run_benchmarks.sh pula e lista bench sem CHECKSUM em vez de abortar, como o intercalado já faz.

Benches consertados (segundo commit)

  • bench_bst_owned.nx e bench_bst_ref.nx não compilavam na v0.25.0: declaravam campo e parâmetro com T nu e passavam null (expected TreeNode, got null). Agora seguem o idioma da spec §3 "Self-Reference": campos TreeNode? / ref TreeNode?, ref (TreeNode?) ao slot em insert/count, let raiz: TreeNode? = null. Em count do owned, o narrowing de *node não sobrevive à chamada recursiva com raiz ref, então o primeiro resultado é vinculado a um let e *node é testado de novo antes do segundo empréstimo, como o próprio compilador sugere. Tempos na mesma máquina (667 ms / 211 ms) ficam na ordem dos publicados no RESULTS.md (565–780 / 217): o caminho medido é o mesmo.
  • bench_hash31_bytes.nx nunca imprimiu CHECKSUM; ganha a linha para entrar nos runners.

Com isso, os 18 benches da suíte imprimem CHECKSUM na v0.25.0.

Cross-runtime em Linux

Razões noxy/python piores que no Windows (fib 1,16x → 1,80x, loop_arith 1,06x → 1,28x, string_ops 2,17x → 3,07x). O que mudou de lado foi o CPython (build gcc + PGO/LTO do Debian/Ubuntu contra o build MSVC), não o Noxy: os três binários disponíveis deram o mesmo fib. Piso de processo: noxy 3 ms, python 10 ms.

Verificação

  • bash -n nos três scripts.
  • Os três rodados de ponta a ponta em Ubuntu 26.04 (cross-runtime com e sem --noxy-baseline, suíte com 3 runs, intercalado com 3 runs); checksums batem entre noxy, python e go em todos os benches.
  • Nenhum arquivo Go tocado.

🤖 Generated with Claude Code

https://claude.ai/code/session_013tLpxkXEQZgrHZaQdAj1c7

estevaofon and others added 2 commits September 5, 2026 17:59
…runtime em Ubuntu

Porta os três runners PowerShell para bash com o mesmo protocolo e a mesma
saída: `run_benchmarks.sh` (suíte por binário, mediana), `interleaved_compare.sh`
(dois binários intercalados, guard de CHECKSUM, benches sem equivalência
pulados e listados) e `cross_runtime/run_cross_runtime.sh` (Noxy × CPython ×
Lua × Go, mínimo de N, coluna `--noxy-baseline` na mesma janela, líquido e
razões). Números saem com ponto decimal fixo (`LC_NUMERIC=C`).

`run_benchmarks.sh` pula e lista bench sem linha CHECKSUM em vez de abortar,
como o intercalado já faz: hoje `bench_bst_owned`/`bench_bst_ref` não compilam
na v0.25.0 (construtor com `null` em campo não-anulável) e `bench_hash31_bytes`
nunca imprimiu CHECKSUM — o `.ps1` aborta no primeiro deles.

Adiciona `cross_runtime/results/2026-09-05-v0250-ubuntu.md`: primeira medição
em Linux (Ubuntu 26.04, CPython 3.14.4 do pacote, Go 1.27.1). As razões
noxy/python são piores que as do Windows (fib 1,16x → 1,80x) porque o build
gcc + PGO/LTO do CPython no Linux é mais rápido que o build MSVC; o Noxy
rende igual nos três binários disponíveis.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013tLpxkXEQZgrHZaQdAj1c7
… hash31

Os dois benches BST ainda declaravam campo e parâmetro com `T` nu e passavam
`null`, o que a spec §2.4 rejeita desde a regra de nulabilidade ("expected
TreeNode, got null"). Seguem agora o idioma da spec §3 "Self-Reference":

- bst_owned: `esquerda/direita: TreeNode?`, `ref (TreeNode?)` ao slot em
  `insert`/`count`, `let raiz: TreeNode? = null`. Em `count`, o narrowing de
  `*node` não sobrevive à chamada recursiva com raiz `ref`, então o primeiro
  `count(ref node.esquerda)` é vinculado a um `let` e `*node` é testado de
  novo antes do segundo empréstimo — exatamente o hint do compilador.
- bst_ref: `esquerda/direita: ref TreeNode?`, `count(node: ref TreeNode?)`
  vincula `let n: ref TreeNode = node` uma vez, como em noxy_examples/bst.nx.

Tempos na mesma máquina (667 ms / 211 ms) ficam na ordem dos publicados no
RESULTS.md (565–780 / 217): o caminho medido é o mesmo.

bench_hash31_bytes nunca imprimiu CHECKSUM; ganha a linha para entrar nos
runners sem ser pulado.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013tLpxkXEQZgrHZaQdAj1c7
@estevaofon
estevaofon merged commit d26989e into develop Sep 5, 2026
7 checks passed
@estevaofon
estevaofon deleted the chore/bench-runners-bash branch September 5, 2026 22:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant