perf(vm): skip coverage and limit polls on production dispatch - #1216
perf(vm): skip coverage and limit polls on production dispatch#1216frostney wants to merge 2 commits into
Conversation
Prod bytecode dispatch now uses a dedicated loop head that skips stop-IP, coverage, opcode profiling, and instruction-limit polling, sharing one opcode case with the instrumented path. Co-authored-by: Cursor <cursoragent@cursor.com>
Accepted isolated lane on optimize/w2-prod-dispatch. Prod ExecuteRegisters skips stop-IP, coverage, profiler, and inactive instruction-limit polls while sharing one opcode case with the instrumented path.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (8)
Included review availability: 3 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 5 reviews per hour. 📝 WalkthroughWalkthroughChangesInstruction-limit dispatch behavior
Estimated code review effort: 1 (Trivial) | ~5 minutes Merge Risk: ⚪ Minimal · up to The production dispatch path removes inactive instrumentation polls while preserving the shared opcode behavior; no actionable merge-blocking risk remains after normal checks and review. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Full details: Description checkExplanation The description includes the required Summary and Testing sections. It explains the implementation, constraints, non-goals, related stack references, test coverage, documentation updates, and benchmark results. Full details: Docstring CoverageExplanation No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0 files. (6 skipped: 6 unsupported.) Comment |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Web Tooling Benchmark
18 pinned Web Tooling workloads; 18 workloads produced at least one Goccia sample. Raw results from 1 sample per workload; full stdout/stderr for failures and min/max/CV stay in the |
Suite TimingTest Runner (interpreted: 12,813 passed; bytecode: 12,813 passed)
MemoryGC rows aggregate the main thread plus all worker thread-local GCs. Test runner worker shutdown frees thread-local heaps in bulk; that shutdown reclamation is not counted as GC collections or collected objects.
Benchmarks (interpreted: 440; bytecode: 440)
MemoryGC rows aggregate the main thread plus all worker thread-local GCs. Benchmark runner performs explicit between-file collections, so collection and collected-object counts can be much higher than the test runner.
Boot
Empty-script ( Measured on ubuntu-latest x64. |
Benchmark Results440 benchmarks · PR vs same-runner Interpreted: 🟢 22 improved · 🔴 34 regressed · 384 unchanged · avg +0.2% Typical per-run noise (median variance): interpreted ±1.7%, bytecode ±1.4%. Deltas within noise overlap and read as unchanged. arraybuffer.js — Interp: 🟢 3, 🔴 2, 9 unch. · avg +0.4% · Bytecode: 🟢 1, 13 unch. · avg +0.5%
arrays.js — Interp: 19 unch. · avg +0.3% · Bytecode: 🟢 4, 15 unch. · avg +1.1%
async-await.js — Interp: 6 unch. · avg -2.1% · Bytecode: 6 unch. · avg +1.8%
async-generators.js — Interp: 2 unch. · avg -1.8% · Bytecode: 2 unch. · avg -0.7%
atomics.js — Interp: 6 unch. · avg -2.1% · Bytecode: 🟢 3, 3 unch. · avg +2.6%
base64.js — Interp: 🔴 2, 8 unch. · avg -0.2% · Bytecode: 🟢 4, 6 unch. · avg +1.7%
classes.js — Interp: 🟢 1, 🔴 2, 28 unch. · avg +0.2% · Bytecode: 🟢 4, 27 unch. · avg +1.6%
closures.js — Interp: 🔴 1, 10 unch. · avg -0.4% · Bytecode: 🟢 3, 8 unch. · avg +2.2%
collections.js — Interp: 🟢 2, 10 unch. · avg +2.2% · Bytecode: 🟢 1, 11 unch. · avg +2.3%
csv.js — Interp: 13 unch. · avg +0.0% · Bytecode: 🟢 1, 12 unch. · avg +0.6%
destructuring.js — Interp: 🔴 1, 21 unch. · avg -1.6% · Bytecode: 🟢 3, 🔴 1, 18 unch. · avg +1.0%
fibonacci.js — Interp: 🔴 1, 7 unch. · avg -0.8% · Bytecode: 🟢 1, 7 unch. · avg +3.8%
float16array.js — Interp: 🟢 2, 30 unch. · avg +0.4% · Bytecode: 🟢 5, 27 unch. · avg +2.9%
for-in/for-in.js — Interp: 3 unch. · avg +0.8% · Bytecode: 3 unch. · avg -0.1%
for-of.js — Interp: 🟢 1, 6 unch. · avg -0.6% · Bytecode: 🟢 1, 6 unch. · avg +5.2%
generators.js — Interp: 4 unch. · avg +0.1% · Bytecode: 4 unch. · avg +0.1%
intl.js — Interp: 🔴 2, 4 unch. · avg -2.6% · Bytecode: 🟢 1, 5 unch. · avg -0.2%
iterators.js — Interp: 🔴 4, 38 unch. · avg -1.7% · Bytecode: 🟢 13, 29 unch. · avg +2.4%
json.js — Interp: 🟢 2, 🔴 1, 20 unch. · avg -0.0% · Bytecode: 🔴 2, 21 unch. · avg -0.7%
jsx.jsx — Interp: 🔴 1, 20 unch. · avg -1.0% · Bytecode: 🟢 4, 🔴 1, 16 unch. · avg +1.5%
modules.js — Interp: 9 unch. · avg +2.8% · Bytecode: 🟢 1, 8 unch. · avg -1.2%
numbers.js — Interp: 🟢 1, 11 unch. · avg +0.4% · Bytecode: 🟢 2, 10 unch. · avg +0.4%
objects.js — Interp: 8 unch. · avg +1.5% · Bytecode: 8 unch. · avg +0.3%
promises.js — Interp: 🔴 1, 11 unch. · avg -1.1% · Bytecode: 12 unch. · avg +0.4%
property-access.js — Interp: 5 unch. · avg +2.1% · Bytecode: 5 unch. · avg +5.8%
regexp.js — Interp: 🔴 1, 12 unch. · avg +0.3% · Bytecode: 🟢 1, 🔴 1, 11 unch. · avg -2.0%
strings.js — Interp: 🔴 2, 17 unch. · avg -0.8% · Bytecode: 🟢 1, 🔴 1, 17 unch. · avg +0.2%
temporal.js — Interp: 🔴 1, 5 unch. · avg -1.2% · Bytecode: 6 unch. · avg +0.8%
tsv.js — Interp: 🔴 1, 8 unch. · avg -0.7% · Bytecode: 🟢 3, 6 unch. · avg +3.9%
typed-arrays.js — Interp: 🔴 9, 13 unch. · avg -9.5% · Bytecode: 🟢 6, 🔴 2, 14 unch. · avg +2.4%
uint8array-encoding.js — Interp: 🟢 8, 10 unch. · avg +26.9% · Bytecode: 🔴 5, 13 unch. · avg -8.3%
weak-collections.js — Interp: 🟢 2, 🔴 2, 11 unch. · avg -5.4% · Bytecode: 🟢 4, 🔴 1, 10 unch. · avg +4.1%
Deterministic profile diffDeterministic profile diff: no significant changes. Measured on ubuntu-latest x64. Each PR run also builds the |
JetStream 3 Performance Barometer
Geomean reference ratio: QuickJS 27.51×; Node.js 303.37×. 1.00× means aligned; values above 1.00× mean Goccia was proportionally slower after normalizing JetStream’s higher-is-better score. This is a directional barometer across runtimes with different goals, not a product ranking. Raw samples and failure details remain in the |
test262 Conformance
Areas closest to 100%
Per-test deltas (+0 / -0 / timeout +2 / -1)New timeouts (2):
Resolved timeouts (1):
Steady-state failures and timeouts are non-blocking; PASS → non-timeout failure transitions fail the conformance gate. Measured on ubuntu-latest x64, bytecode mode. Areas grouped by the first two test262 path components; minimum 25 attempted tests, areas already at 100% excluded. Δ vs main compares against the most recent cached |
AWFY Results
Geomean Ratios
14 pinned AWFY benchmarks. Medians from 5 interleaved samples per engine; raw JSON includes min/max/CV and is attached as the |
|
@coderabbitai review |
✅ Action performedReview finished.
|
Summary
ExecuteRegistersinto a production loop and an instrumented loop that share one opcodecaseviaGoccia.VM.DispatchCase.inc. The production path omits stop-IP, coverage, opcode profiling, and inactive instruction-limit polls.#1215←#1216←#1217).case(FPC “Procedure too complex”), changing observable VM semantics.Testing
Full interpreter + bytecode JS suite and Pascal unit tests were run on stack tip
629087c8. Docs updates:docs/bytecode-vm.md,docs/embedding.md,docs/profiling.md,docs/testing.md. Combined A/B vs the wave-1 head (/tmp/combined-w2-prod-dispatch-ab.json): loop-dispatch-floor 0.960, Richards 0.961, Bounce 0.985, geomean 0.958; checksums matched.