Files
orca/config/scripts/terminal-partial-escape-tail-benchmark.mjs
NeilandClaude 161bdf93c3 fix(bench): load benchmark modules under test through jiti (#23482)
`pnpm run bench:terminal-partial-escape-tail` and
`pnpm run bench:worktree-refresh-churn` both died at startup with
ERR_MODULE_NOT_FOUND. Each entrypoint static-imported a `src/` module with an
explicit `.ts` extension, but bare `node` type-stripping cannot resolve the
extensionless relative specifiers *inside* that module's graph
(`terminal-partial-escape-tail.ts` -> `./terminal-escape-introducer`,
`worktree-catalog-reconciliation.ts` -> `../../../../shared/structural-value-equality`).

Routes both through jiti, matching the four benchmarks that already load `src/`
TypeScript that way (`pty-source-ack-boundary`, `locale-collator-sort`,
`worktree-base-pending-marker`, `wsl-git-shell`). Adding the extension at each
import site was the alternative, but `config/tsconfig.node.json` does not set
`allowImportingTsExtensions`, so a `.ts` specifier in `src/shared` fails
typecheck with TS5097 -- and no file under `src/` uses that shape today.

Developer tooling only; no production code changed.

Co-authored-by: Claude <noreply@anthropic.com>
2026-09-27 15:34:38 -07:00

90 lines
3.2 KiB
JavaScript

#!/usr/bin/env node
// Times the partial-escape-tail fold that runs once per PTY chunk for every terminal against a
// baseline with the pre-change shape (unconditional concat + per-code-unit walk). Equivalence is
// proven over a corpus first, so the reported speedup cannot come from the gate changing the answer.
import { performance } from 'node:perf_hooks'
import { createJiti } from 'jiti'
const CHUNK_BYTES = 16 * 1024
const CHUNKS = 640
const ROUNDS = 7
// jiti, not a bare `node` import: type-stripping cannot resolve the extensionless
// relative imports inside the module graph under test.
const jiti = createJiti(import.meta.url)
const { advancePartialEscapeTail, extractPartialEscapeTail, MAX_PARTIAL_ESCAPE_TAIL_LENGTH } =
await jiti.import('../../src/shared/terminal-partial-escape-tail.ts')
function baselineAdvance(pendingTail, chunk) {
const tail = extractPartialEscapeTail(pendingTail + chunk)
return tail.length > MAX_PARTIAL_ESCAPE_TAIL_LENGTH ? '' : tail
}
const chunkOf = (line) => line.repeat(Math.ceil(CHUNK_BYTES / line.length)).slice(0, CHUNK_BYTES)
const escFreeChunk = chunkOf('[build] compiled src/renderer/src/components/thing.tsx in 12ms\n')
const colouredChunk = chunkOf(
'\x1b[32m[build]\x1b[0m compiled src/renderer/src/components/thing.tsx in 12ms\n'
)
// Every state the scanner can be left in, plus the boundaries the gate must not swallow.
const PIECES = [
'',
'plain output\n',
'\x1b[32mgreen\x1b[0m',
'\x1b[3',
'\x1b]0;title\x07',
'\x1b]0;partial',
'\x1bP dcs payload',
'\x1b',
'\x18',
'\x1a',
'\x1b]8;;https://example.com\x1b\\',
'\x1b]8;;https://example.com\x1b',
'\x1b(B',
'\x1b(',
'\x1b[1;2;3',
escFreeChunk
]
let checked = 0
for (const pending of PIECES.map((piece) => extractPartialEscapeTail(piece))) {
for (const chunk of PIECES) {
const expected = baselineAdvance(pending, chunk)
const actual = advancePartialEscapeTail(pending, chunk)
if (expected !== actual) {
throw new Error(
`gate changed the tracked tail: ${JSON.stringify({ pending, chunk, expected, actual })}`
)
}
checked += 1
}
}
function medianMs(advance, chunk) {
// First sample is the warm-up and is discarded.
const samples = Array.from({ length: ROUNDS + 1 }, () => {
const start = performance.now()
let tail = ''
for (let index = 0; index < CHUNKS; index += 1) {
tail = advance(tail, chunk)
}
return performance.now() - start
})
return samples.slice(1).sort((left, right) => left - right)[Math.floor(ROUNDS / 2)]
}
const megabytes = ((CHUNK_BYTES * CHUNKS) / 1024 / 1024).toFixed(1)
console.log(
`Partial-escape-tail fold: ${CHUNKS} x ${CHUNK_BYTES / 1024} KB chunks (${megabytes} MB), ${checked} equivalence cases verified\n`
)
console.log('| stream shape | before | after | |')
console.log('| --- | --- | --- | --- |')
for (const [label, chunk] of [
['ESC-free (build logs, `cat`, piped output)', escFreeChunk],
['SGR-coloured output (gate does not apply)', colouredChunk]
]) {
const before = medianMs(baselineAdvance, chunk)
const after = medianMs(advancePartialEscapeTail, chunk)
console.log(
`| ${label} | ${before.toFixed(2)} ms | ${after.toFixed(2)} ms | ${(before / after).toFixed(1)}x |`
)
}