Skip to content

Use range-based benchmark comparison in PR comments#144

Merged
frostney merged 3 commits into
mainfrom
feature/pr-benchmark-range-comparison
Mar 31, 2026
Merged

Use range-based benchmark comparison in PR comments#144
frostney merged 3 commits into
mainfrom
feature/pr-benchmark-range-comparison

Conversation

@frostney
Copy link
Copy Markdown
Owner

@frostney frostney commented Mar 30, 2026

Fixes #116

Summary

  • classify PR benchmark changes by baseline/PR min-max ops/sec range overlap instead of a single ops/sec point value
  • keep percentage deltas in the PR comment as secondary context and update the footer text accordingly
  • update the benchmark and build-system docs to describe the new comparison behavior and cached JSON fields

Verification

  • syntax-checked the embedded github-script block with node --check
  • exercised the benchmark comment script with mock baseline/current JSON to confirm overlap, improvement, and regression rendering

Summary by CodeRabbit

  • Refactor

    • Improved benchmark comparison methodology. Replaced fixed threshold-based classification with range-aware evaluation that considers performance variance ranges, providing more nuanced delta assessment.
  • Documentation

    • Updated benchmark documentation. Now displays point estimates with associated min/max ranges and uses range-overlap classification for improved/regressed/unchanged status determination.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 30, 2026

Warning

Rate limit exceeded

@frostney has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 1 minutes and 6 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 1 minutes and 6 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: d679241d-fbbb-4660-b212-ed69e023d351

📥 Commits

Reviewing files that changed from the base of the PR and between 951e135 and 53ee5ab.

📒 Files selected for processing (1)
  • .github/workflows/pr.yml
📝 Walkthrough

Walkthrough

This PR replaces single-value benchmark comparison in CI with a range-aware approach. Benchmarks now include minimum and maximum ops/sec values alongside point estimates, and the comparison logic classifies changes as improved/regressed based on range overlap rather than fixed percentage thresholds, with classification markers displayed in the delta column.

Changes

Cohort / File(s) Summary
CI Workflow Range-Aware Comparison
.github/workflows/pr.yml
Refactored benchmark comparison logic to extract and use minOpsPerSec/maxOpsPerSec from baseline and PR JSON. Replaced single-value percent-threshold delta classification (±7% THRESHOLD) with range-overlap detection: improved if PR min exceeds baseline max, regressed if PR max below baseline min, unchanged on overlap, new if baseline missing. Table output format updated to display formatted ranges (min–max) with ops/sec labels and symbolic markers (🟢/🔴/~ overlap/🆕) in delta column.
Documentation Updates
docs/benchmarks.md, docs/build-system.md
Updated documentation to reflect range-based comparison semantics. Clarified JSON schema now includes minOpsPerSec, maxOpsPerSec, variancePercentage. Revised baseline reference terminology to "cached baseline JSON" and replaced single-point percentage thresholds with range-overlap classification rules. Percent deltas retained as secondary context.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • GocciaScript bytecode benchmarks in PRs #55: Modifies the same CI benchmark comparison flow (.github/workflows/pr.yml) and benchmark documentation, adding per-mode baseline handling while overlapping with the range-aware comparison changes in this PR.

Poem

🐰 Ranges now tell the true tale,
No more false alarms when noise prevails!
Min meets max in overlap's embrace,
CI benchmarks find their proper place!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: replacing point-value comparisons with range-based analysis in PR benchmark comments.
Linked Issues check ✅ Passed The PR fully implements all coding requirements from issue #116: range-overlap classification logic, updated buildMap() to extract min/max/variance, display format showing ranges, and percentage deltas as secondary context.
Out of Scope Changes check ✅ Passed All changes directly support the range-based comparison objective. The workflow, documentation, and build-system updates align with issue #116 requirements with no extraneous modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/pr-benchmark-range-comparison

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 30, 2026

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 3523 3523
Tests Passed 3482 ✅ 3523 ✅
Tests Skipped 41 0
Tests Execution 153.1ms 145.2ms
Tests Engine 304.1ms 528.1ms
Benchmarks Total 263 263
Benchmarks Duration 7.21min 6.04min

Measured on ubuntu-latest x64.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 30, 2026

Benchmark Results

263 benchmarks

Interpreted: 🟢 42 improved · 🔴 74 regressed · 147 unchanged · avg -0.5%
Bytecode: 🟢 5 improved · 🔴 232 regressed · 26 unchanged · avg -7.5%

arraybuffer.js — Interp: 🟢 3, 🔴 3, 8 unch. · avg +0.0% · Bytecode: 🔴 14 · avg -8.4%
Benchmark Interpreted Δ Bytecode Δ
create ArrayBuffer(0) 462,301 ops/sec [458,802..466,241] → 456,673 ops/sec [449,966..459,070] ~ overlap (-1.2%) 561,933 ops/sec [556,135..564,906] → 515,039 ops/sec [514,694..516,430] 🔴 -8.3%
create ArrayBuffer(64) 440,456 ops/sec [435,443..444,269] → 439,113 ops/sec [439,035..441,516] ~ overlap (-0.3%) 532,568 ops/sec [531,189..534,820] → 480,199 ops/sec [464,574..491,037] 🔴 -9.8%
create ArrayBuffer(1024) 346,984 ops/sec [345,640..347,343] → 342,893 ops/sec [340,189..344,484] 🔴 -1.2% 422,269 ops/sec [419,191..424,516] → 377,859 ops/sec [372,041..381,270] 🔴 -10.5%
create ArrayBuffer(8192) 153,321 ops/sec [151,470..154,131] → 153,478 ops/sec [152,040..154,534] ~ overlap (+0.1%) 182,033 ops/sec [181,461..182,396] → 163,543 ops/sec [162,135..164,499] 🔴 -10.2%
slice full buffer (64 bytes) 505,311 ops/sec [502,371..507,014] → 503,717 ops/sec [501,025..504,782] ~ overlap (-0.3%) 661,856 ops/sec [658,797..663,516] → 611,164 ops/sec [610,500..612,608] 🔴 -7.7%
slice half buffer (512 of 1024 bytes) 433,786 ops/sec [429,683..436,156] → 438,162 ops/sec [437,065..439,588] 🟢 +1.0% 566,871 ops/sec [565,871..571,327] → 525,324 ops/sec [502,381..529,673] 🔴 -7.3%
slice with negative indices 428,778 ops/sec [423,192..431,251] → 428,927 ops/sec [420,217..432,536] ~ overlap (+0.0%) 606,673 ops/sec [605,617..608,920] → 557,172 ops/sec [532,839..559,673] 🔴 -8.2%
slice empty range 490,378 ops/sec [488,301..491,661] → 491,110 ops/sec [484,907..494,297] ~ overlap (+0.1%) 648,800 ops/sec [644,710..649,837] → 601,206 ops/sec [598,176..604,943] 🔴 -7.3%
byteLength access 1,341,940 ops/sec [1,335,096..1,347,747] → 1,385,859 ops/sec [1,371,176..1,388,958] 🟢 +3.3% 1,707,660 ops/sec [1,702,302..1,708,847] → 1,614,785 ops/sec [1,598,827..1,616,395] 🔴 -5.4%
Symbol.toStringTag access 1,040,240 ops/sec [1,039,036..1,041,730] → 1,050,051 ops/sec [1,048,644..1,053,384] 🟢 +0.9% 1,127,606 ops/sec [1,124,920..1,129,890] → 1,057,387 ops/sec [1,056,556..1,059,702] 🔴 -6.2%
ArrayBuffer.isView 748,768 ops/sec [738,830..753,457] → 753,347 ops/sec [752,108..754,941] ~ overlap (+0.6%) 922,309 ops/sec [920,896..923,154] → 854,674 ops/sec [851,624..855,087] 🔴 -7.3%
clone ArrayBuffer(64) 418,819 ops/sec [418,677..420,564] → 414,560 ops/sec [413,215..415,549] 🔴 -1.0% 519,553 ops/sec [515,935..521,498] → 474,377 ops/sec [472,514..476,693] 🔴 -8.7%
clone ArrayBuffer(1024) 326,928 ops/sec [326,139..328,287] → 325,336 ops/sec [325,037..326,141] ~ overlap (-0.5%) 412,596 ops/sec [409,670..416,833] → 364,245 ops/sec [360,583..370,526] 🔴 -11.7%
clone ArrayBuffer inside object 267,728 ops/sec [266,701..270,774] → 264,608 ops/sec [263,171..265,166] 🔴 -1.2% 321,236 ops/sec [318,419..322,661] → 294,826 ops/sec [294,474..296,796] 🔴 -8.2%
arrays.js — Interp: 🟢 9, 🔴 4, 6 unch. · avg +0.8% · Bytecode: 🔴 19 · avg -10.5%
Benchmark Interpreted Δ Bytecode Δ
Array.from length 100 13,211 ops/sec [13,139..13,271] → 13,043 ops/sec [12,993..13,116] 🔴 -1.3% 15,612 ops/sec [15,577..15,641] → 14,393 ops/sec [14,312..14,470] 🔴 -7.8%
Array.from 10 elements 221,335 ops/sec [220,575..222,847] → 218,674 ops/sec [217,145..219,171] 🔴 -1.2% 266,653 ops/sec [266,049..268,175] → 244,480 ops/sec [243,279..245,216] 🔴 -8.3%
Array.of 10 elements 278,403 ops/sec [277,604..278,892] → 276,886 ops/sec [276,277..277,658] ~ overlap (-0.5%) 334,835 ops/sec [332,586..334,976] → 313,167 ops/sec [306,840..318,634] 🔴 -6.5%
spread into new array 325,442 ops/sec [323,776..326,399] → 321,151 ops/sec [319,427..322,196] 🔴 -1.3% 207,924 ops/sec [206,518..209,635] → 198,227 ops/sec [195,524..198,406] 🔴 -4.7%
map over 50 elements 24,521 ops/sec [24,327..24,666] → 24,823 ops/sec [24,733..24,947] 🟢 +1.2% 29,099 ops/sec [28,901..29,210] → 26,826 ops/sec [26,691..27,025] 🔴 -7.8%
filter over 50 elements 22,837 ops/sec [22,796..22,891] → 22,967 ops/sec [22,910..23,126] 🟢 +0.6% 26,651 ops/sec [26,551..26,682] → 23,313 ops/sec [23,244..23,533] 🔴 -12.5%
reduce sum 50 elements 25,133 ops/sec [24,968..25,146] → 26,510 ops/sec [26,452..26,591] 🟢 +5.5% 20,938 ops/sec [20,923..20,972] → 19,358 ops/sec [19,174..19,518] 🔴 -7.5%
forEach over 50 elements 22,344 ops/sec [22,094..22,431] → 22,980 ops/sec [22,919..23,036] 🟢 +2.8% 30,770 ops/sec [30,571..30,861] → 21,079 ops/sec [21,020..21,101] 🔴 -31.5%
find in 50 elements 32,076 ops/sec [31,833..32,232] → 32,221 ops/sec [32,145..32,425] ~ overlap (+0.5%) 33,071 ops/sec [32,999..33,108] → 29,608 ops/sec [25,202..29,803] 🔴 -10.5%
sort 20 elements 12,577 ops/sec [12,506..12,641] → 12,471 ops/sec [12,455..12,478] 🔴 -0.8% 14,743 ops/sec [14,721..14,770] → 13,255 ops/sec [10,168..13,355] 🔴 -10.1%
flat nested array 116,883 ops/sec [116,264..117,387] → 115,785 ops/sec [115,215..116,415] ~ overlap (-0.9%) 139,711 ops/sec [139,186..140,729] → 128,939 ops/sec [127,967..129,098] 🔴 -7.7%
flatMap 72,575 ops/sec [72,457..73,227] → 73,007 ops/sec [72,669..73,235] ~ overlap (+0.6%) 89,721 ops/sec [89,296..90,195] → 81,480 ops/sec [81,266..82,241] 🔴 -9.2%
map inside map (5x5) 20,211 ops/sec [20,197..20,404] → 20,438 ops/sec [20,410..20,452] 🟢 +1.1% 24,820 ops/sec [24,724..25,137] → 22,282 ops/sec [22,233..22,329] 🔴 -10.2%
filter inside map (5x10) 15,637 ops/sec [15,554..15,678] → 15,764 ops/sec [15,700..15,814] 🟢 +0.8% 18,526 ops/sec [18,468..18,653] → 16,213 ops/sec [16,099..16,315] 🔴 -12.5%
reduce inside map (5x10) 18,592 ops/sec [18,541..18,665] → 19,091 ops/sec [19,063..19,165] 🟢 +2.7% 17,661 ops/sec [17,590..17,668] → 15,458 ops/sec [15,363..15,530] 🔴 -12.5%
forEach inside forEach (5x10) 16,309 ops/sec [16,187..16,345] → 16,622 ops/sec [16,534..16,668] 🟢 +1.9% 18,508 ops/sec [18,475..18,584] → 16,693 ops/sec [16,630..16,841] 🔴 -9.8%
find inside some (10x10) 13,157 ops/sec [13,144..13,174] → 13,332 ops/sec [13,279..13,361] 🟢 +1.3% 14,313 ops/sec [14,289..14,375] → 12,995 ops/sec [12,940..13,069] 🔴 -9.2%
map+filter chain nested (5x20) 5,113 ops/sec [5,085..5,154] → 5,138 ops/sec [5,113..5,158] ~ overlap (+0.5%) 6,030 ops/sec [6,019..6,038] → 5,348 ops/sec [5,332..5,362] 🔴 -11.3%
reduce flatten (10x5) 37,510 ops/sec [37,326..37,837] → 38,082 ops/sec [37,495..38,351] ~ overlap (+1.5%) 19,216 ops/sec [19,155..19,276] → 17,269 ops/sec [17,229..17,379] 🔴 -10.1%
async-await.js — Interp: 🟢 1, 🔴 1, 4 unch. · avg +0.1% · Bytecode: 🔴 6 · avg -9.3%
Benchmark Interpreted Δ Bytecode Δ
single await 376,248 ops/sec [374,683..380,247] → 376,712 ops/sec [374,792..377,830] ~ overlap (+0.1%) 449,506 ops/sec [447,845..450,973] → 402,523 ops/sec [399,958..403,327] 🔴 -10.5%
multiple awaits 169,125 ops/sec [167,880..171,164] → 171,497 ops/sec [171,179..171,765] 🟢 +1.4% 196,626 ops/sec [195,497..197,282] → 176,580 ops/sec [174,535..177,250] 🔴 -10.2%
await non-Promise value 839,801 ops/sec [831,357..851,777] → 837,868 ops/sec [834,661..841,036] ~ overlap (-0.2%) 1,170,424 ops/sec [1,166,104..1,179,778] → 1,085,502 ops/sec [1,082,095..1,097,113] 🔴 -7.3%
await with try/catch 365,461 ops/sec [363,584..366,824] → 363,503 ops/sec [362,315..363,636] ~ overlap (-0.5%) 442,618 ops/sec [441,137..444,404] → 396,556 ops/sec [394,944..398,282] 🔴 -10.4%
await Promise.all 51,437 ops/sec [50,907..51,614] → 51,805 ops/sec [51,566..52,135] ~ overlap (+0.7%) 56,604 ops/sec [56,412..56,821] → 51,929 ops/sec [51,656..52,110] 🔴 -8.3%
nested async function call 192,686 ops/sec [192,414..193,507] → 190,860 ops/sec [190,668..191,045] 🔴 -0.9% 251,322 ops/sec [249,913..252,816] → 228,830 ops/sec [227,070..230,813] 🔴 -8.9%
classes.js — Interp: 🟢 5, 🔴 5, 21 unch. · avg +0.3% · Bytecode: 🟢 1, 🔴 18, 12 unch. · avg -6.9%
Benchmark Interpreted Δ Bytecode Δ
simple class new 139,123 ops/sec [138,850..139,876] → 137,370 ops/sec [137,063..138,220] 🔴 -1.3% 218,718 ops/sec [218,274..219,447] → 202,641 ops/sec [199,814..203,412] 🔴 -7.4%
class with defaults 109,944 ops/sec [109,455..110,099] → 112,463 ops/sec [112,285..112,925] 🟢 +2.3% 152,567 ops/sec [151,795..153,262] → 142,732 ops/sec [141,904..143,115] 🔴 -6.4%
50 instances via Array.from 5,605 ops/sec [5,594..5,620] → 5,705 ops/sec [5,674..5,739] 🟢 +1.8% 8,695 ops/sec [8,647..8,724] → 7,912 ops/sec [7,826..7,978] 🔴 -9.0%
instance method call 71,250 ops/sec [71,221..71,354] → 70,777 ops/sec [70,619..71,006] 🔴 -0.7% 101,066 ops/sec [100,827..101,331] → 93,488 ops/sec [92,779..95,543] 🔴 -7.5%
static method call 114,857 ops/sec [114,296..115,052] → 113,411 ops/sec [112,914..113,969] 🔴 -1.3% 204,737 ops/sec [201,375..205,397] → 186,747 ops/sec [185,811..188,079] 🔴 -8.8%
single-level inheritance 56,323 ops/sec [56,143..56,470] → 55,337 ops/sec [55,058..55,546] 🔴 -1.7% 81,626 ops/sec [81,294..82,571] → 74,166 ops/sec [73,042..74,669] 🔴 -9.1%
two-level inheritance 48,059 ops/sec [47,899..48,336] → 47,225 ops/sec [47,185..47,484] 🔴 -1.7% 65,083 ops/sec [63,968..65,942] → 59,464 ops/sec [57,982..61,025] 🔴 -8.6%
private field access 71,986 ops/sec [71,650..72,238] → 71,419 ops/sec [71,008..71,929] ~ overlap (-0.8%) 105,517 ops/sec [105,116..105,918] → 94,398 ops/sec [92,505..95,974] 🔴 -10.5%
private methods 80,242 ops/sec [79,273..80,845] → 78,788 ops/sec [78,055..79,515] ~ overlap (-1.8%) 112,797 ops/sec [111,804..113,974] → 101,571 ops/sec [100,571..102,444] 🔴 -10.0%
getter/setter access 75,740 ops/sec [75,528..75,997] → 76,128 ops/sec [75,599..76,433] ~ overlap (+0.5%) 116,010 ops/sec [115,654..116,246] → 107,438 ops/sec [106,474..107,970] 🔴 -7.4%
class decorator (identity) 92,910 ops/sec [92,481..93,774] → 93,582 ops/sec [93,064..94,151] ~ overlap (+0.7%) 111,923 ops/sec [110,531..113,896] → 102,348 ops/sec [101,517..102,755] 🔴 -8.6%
class decorator (wrapping) 54,944 ops/sec [54,485..55,534] → 54,432 ops/sec [54,292..54,692] ~ overlap (-0.9%) 64,254 ops/sec [61,411..66,517] → 59,292 ops/sec [56,747..61,785] ~ overlap (-7.7%)
identity method decorator 65,686 ops/sec [65,238..66,057] → 65,720 ops/sec [65,607..66,330] ~ overlap (+0.1%) 95,462 ops/sec [91,480..100,062] → 86,976 ops/sec [80,969..93,298] ~ overlap (-8.9%)
wrapping method decorator 52,435 ops/sec [51,860..52,777] → 52,726 ops/sec [52,556..52,889] ~ overlap (+0.6%) 67,466 ops/sec [64,528..70,126] → 61,415 ops/sec [58,427..66,421] ~ overlap (-9.0%)
stacked method decorators (x3) 35,330 ops/sec [35,171..35,388] → 35,434 ops/sec [35,242..35,608] ~ overlap (+0.3%) 46,096 ops/sec [43,576..48,342] → 41,671 ops/sec [39,962..45,661] ~ overlap (-9.6%)
identity field decorator 70,749 ops/sec [70,358..71,266] → 72,066 ops/sec [71,449..72,486] 🟢 +1.9% 83,722 ops/sec [80,769..88,094] → 74,124 ops/sec [72,287..77,441] 🔴 -11.5%
field initializer decorator 60,119 ops/sec [58,976..60,613] → 60,732 ops/sec [60,574..60,846] ~ overlap (+1.0%) 74,897 ops/sec [69,464..78,743] → 62,158 ops/sec [61,381..67,187] 🔴 -17.0%
getter decorator (identity) 64,634 ops/sec [64,404..65,378] → 66,996 ops/sec [66,504..67,244] 🟢 +3.7% 83,188 ops/sec [80,321..85,855] → 74,723 ops/sec [73,706..76,186] 🔴 -10.2%
setter decorator (identity) 54,490 ops/sec [54,193..54,909] → 55,669 ops/sec [55,405..55,859] 🟢 +2.2% 66,805 ops/sec [66,186..68,466] → 61,328 ops/sec [61,059..61,675] 🔴 -8.2%
static method decorator 70,276 ops/sec [69,444..70,895] → 71,293 ops/sec [70,479..71,646] ~ overlap (+1.4%) 86,064 ops/sec [82,285..91,891] → 80,250 ops/sec [77,514..83,870] ~ overlap (-6.8%)
static field decorator 82,409 ops/sec [78,747..83,332] → 83,352 ops/sec [81,616..83,648] ~ overlap (+1.1%) 88,736 ops/sec [85,458..94,169] → 87,367 ops/sec [83,353..93,433] ~ overlap (-1.5%)
private method decorator 53,462 ops/sec [53,267..53,785] → 53,635 ops/sec [53,130..53,955] ~ overlap (+0.3%) 86,450 ops/sec [81,833..91,153] → 72,565 ops/sec [69,553..76,511] 🔴 -16.1%
private field decorator 59,070 ops/sec [58,239..59,522] → 59,108 ops/sec [58,759..59,424] ~ overlap (+0.1%) 61,133 ops/sec [60,284..61,668] → 63,158 ops/sec [61,540..65,013] ~ overlap (+3.3%)
plain auto-accessor (no decorator) 102,344 ops/sec [101,361..104,041] → 103,551 ops/sec [100,828..106,733] ~ overlap (+1.2%) 114,186 ops/sec [107,344..121,830] → 97,440 ops/sec [94,135..104,143] 🔴 -14.7%
auto-accessor with decorator 54,906 ops/sec [53,645..56,139] → 53,924 ops/sec [53,230..55,570] ~ overlap (-1.8%) 60,890 ops/sec [56,577..63,489] → 57,137 ops/sec [50,058..62,235] ~ overlap (-6.2%)
decorator writing metadata 44,199 ops/sec [42,275..44,766] → 43,783 ops/sec [43,613..44,268] ~ overlap (-0.9%) 50,362 ops/sec [48,700..52,299] → 50,587 ops/sec [49,248..54,475] ~ overlap (+0.4%)
static getter read 128,456 ops/sec [124,828..130,175] → 127,112 ops/sec [126,084..128,681] ~ overlap (-1.0%) 164,267 ops/sec [162,279..166,320] → 169,246 ops/sec [164,752..171,538] ~ overlap (+3.0%)
static getter/setter pair 97,375 ops/sec [95,785..99,539] → 98,361 ops/sec [97,372..98,724] ~ overlap (+1.0%) 121,548 ops/sec [119,159..128,396] → 118,231 ops/sec [117,848..118,687] 🔴 -2.7%
inherited static getter 76,376 ops/sec [76,099..77,058] → 76,984 ops/sec [76,742..76,996] ~ overlap (+0.8%) 97,881 ops/sec [97,613..98,634] → 101,754 ops/sec [100,352..102,549] 🟢 +4.0%
inherited static setter 82,769 ops/sec [81,645..83,489] → 82,360 ops/sec [82,093..82,790] ~ overlap (-0.5%) 107,026 ops/sec [106,426..111,149] → 102,718 ops/sec [101,053..106,748] ~ overlap (-4.0%)
inherited static getter with this binding 69,885 ops/sec [69,715..71,052] → 71,214 ops/sec [70,799..71,693] ~ overlap (+1.9%) 88,082 ops/sec [87,687..88,635] → 89,220 ops/sec [88,310..91,534] ~ overlap (+1.3%)
closures.js — Interp: 🟢 5, 🔴 1, 5 unch. · avg +0.4% · Bytecode: 🔴 7, 4 unch. · avg -4.6%
Benchmark Interpreted Δ Bytecode Δ
closure over single variable 130,471 ops/sec [129,421..130,613] → 132,286 ops/sec [131,936..132,512] 🟢 +1.4% 293,124 ops/sec [289,227..295,352] → 276,077 ops/sec [270,610..279,493] 🔴 -5.8%
closure over multiple variables 117,723 ops/sec [116,874..118,109] → 121,593 ops/sec [117,871..121,863] ~ overlap (+3.3%) 199,855 ops/sec [198,030..206,540] → 197,418 ops/sec [192,846..205,142] ~ overlap (-1.2%)
nested closures 124,910 ops/sec [124,716..125,295] → 126,736 ops/sec [124,608..128,088] ~ overlap (+1.5%) 231,965 ops/sec [230,090..250,318] → 226,579 ops/sec [221,066..240,184] ~ overlap (-2.3%)
function as argument 93,359 ops/sec [90,675..94,166] → 91,435 ops/sec [91,253..91,668] ~ overlap (-2.1%) 260,549 ops/sec [260,129..261,650] → 250,361 ops/sec [247,182..252,462] 🔴 -3.9%
function returning function 114,251 ops/sec [113,768..114,432] → 117,810 ops/sec [116,201..119,800] 🟢 +3.1% 299,170 ops/sec [296,569..300,258] → 280,465 ops/sec [278,356..282,040] 🔴 -6.3%
compose two functions 69,647 ops/sec [69,622..70,105] → 70,668 ops/sec [70,420..70,819] 🟢 +1.5% 153,471 ops/sec [152,150..154,195] → 152,124 ops/sec [144,524..155,776] ~ overlap (-0.9%)
fn.call 153,328 ops/sec [150,429..155,004] → 147,651 ops/sec [146,862..148,308] 🔴 -3.7% 227,917 ops/sec [226,288..228,441] → 226,916 ops/sec [224,011..226,949] ~ overlap (-0.4%)
fn.apply 109,258 ops/sec [108,470..110,046] → 107,166 ops/sec [106,807..109,152] ~ overlap (-1.9%) 162,416 ops/sec [161,176..165,584] → 159,398 ops/sec [158,421..160,134] 🔴 -1.9%
fn.bind 143,722 ops/sec [141,961..145,790] → 140,581 ops/sec [139,493..142,005] ~ overlap (-2.2%) 296,462 ops/sec [295,260..296,864] → 280,539 ops/sec [276,806..281,493] 🔴 -5.4%
recursive sum to 50 12,040 ops/sec [11,984..12,109] → 12,176 ops/sec [12,144..12,205] 🟢 +1.1% 27,006 ops/sec [26,975..27,071] → 23,658 ops/sec [23,590..23,728] 🔴 -12.4%
recursive tree traversal 20,191 ops/sec [20,043..20,334] → 20,578 ops/sec [20,498..20,640] 🟢 +1.9% 38,526 ops/sec [38,317..38,679] → 34,416 ops/sec [32,456..34,943] 🔴 -10.7%
collections.js — Interp: 🟢 3, 🔴 2, 7 unch. · avg +0.7% · Bytecode: 🟢 1, 🔴 10, 1 unch. · avg -4.8%
Benchmark Interpreted Δ Bytecode Δ
add 50 elements 6,896 ops/sec [6,887..6,916] → 7,093 ops/sec [7,028..7,110] 🟢 +2.9% 7,636 ops/sec [7,618..7,691] → 7,131 ops/sec [7,098..7,175] 🔴 -6.6%
has lookup (50 elements) 88,299 ops/sec [87,042..88,543] → 90,409 ops/sec [90,333..90,459] 🟢 +2.4% 101,197 ops/sec [100,951..101,272] → 96,409 ops/sec [83,934..97,282] 🔴 -4.7%
delete elements 46,722 ops/sec [46,506..46,986] → 48,089 ops/sec [48,054..48,288] 🟢 +2.9% 50,770 ops/sec [50,740..50,810] → 47,790 ops/sec [47,625..48,091] 🔴 -5.9%
forEach iteration 15,813 ops/sec [15,609..15,886] → 15,706 ops/sec [15,586..15,852] ~ overlap (-0.7%) 16,727 ops/sec [16,638..16,794] → 15,218 ops/sec [15,132..15,353] 🔴 -9.0%
spread to array 27,504 ops/sec [27,438..27,572] → 28,052 ops/sec [27,564..28,492] ~ overlap (+2.0%) 231,607 ops/sec [230,540..233,650] → 209,758 ops/sec [196,296..215,842] 🔴 -9.4%
deduplicate array 36,425 ops/sec [35,934..36,862] → 37,278 ops/sec [36,595..37,756] ~ overlap (+2.3%) 73,505 ops/sec [72,850..73,904] → 69,466 ops/sec [65,358..71,972] 🔴 -5.5%
set 50 entries 5,141 ops/sec [5,122..5,149] → 5,213 ops/sec [5,148..5,234] ~ overlap (+1.4%) 5,611 ops/sec [5,586..5,619] → 5,459 ops/sec [5,370..5,517] 🔴 -2.7%
get lookup (50 entries) 87,122 ops/sec [86,681..87,381] → 86,382 ops/sec [86,116..87,041] ~ overlap (-0.8%) 92,049 ops/sec [91,995..92,183] → 90,167 ops/sec [89,329..90,391] 🔴 -2.0%
has check 129,001 ops/sec [128,849..129,450] → 128,256 ops/sec [128,209..128,333] 🔴 -0.6% 142,453 ops/sec [142,121..142,655] → 137,777 ops/sec [133,603..140,115] 🔴 -3.3%
delete entries 45,965 ops/sec [45,901..46,032] → 45,516 ops/sec [45,439..45,617] 🔴 -1.0% 46,961 ops/sec [46,848..47,066] → 46,686 ops/sec [40,781..46,963] ~ overlap (-0.6%)
forEach iteration 15,792 ops/sec [15,607..15,880] → 15,662 ops/sec [15,639..15,882] ~ overlap (-0.8%) 17,036 ops/sec [16,948..17,090] → 15,400 ops/sec [15,338..15,444] 🔴 -9.6%
keys/values/entries 7,727 ops/sec [7,581..7,845] → 7,603 ops/sec [7,338..7,704] ~ overlap (-1.6%) 26,361 ops/sec [26,159..26,394] → 26,923 ops/sec [26,666..28,278] 🟢 +2.1%
destructuring.js — Interp: 🔴 15, 7 unch. · avg -3.0% · Bytecode: 🔴 19, 3 unch. · avg -7.7%
Benchmark Interpreted Δ Bytecode Δ
simple array destructuring 368,216 ops/sec [364,018..373,369] → 354,632 ops/sec [354,156..357,945] 🔴 -3.7% 266,346 ops/sec [261,581..268,198] → 267,700 ops/sec [264,824..269,574] ~ overlap (+0.5%)
with rest element 246,548 ops/sec [244,095..249,986] → 230,397 ops/sec [230,293..230,661] 🔴 -6.6% 231,235 ops/sec [230,770..231,682] → 204,979 ops/sec [204,478..205,649] 🔴 -11.4%
with defaults 375,709 ops/sec [369,692..384,843] → 370,119 ops/sec [368,336..371,306] ~ overlap (-1.5%) 298,282 ops/sec [296,989..299,527] → 301,501 ops/sec [295,985..303,907] ~ overlap (+1.1%)
skip elements 388,488 ops/sec [385,303..392,498] → 387,921 ops/sec [385,600..391,360] ~ overlap (-0.1%) 324,583 ops/sec [322,671..324,767] → 283,462 ops/sec [280,283..285,476] 🔴 -12.7%
nested array destructuring 168,552 ops/sec [167,690..168,655] → 168,073 ops/sec [166,412..168,910] ~ overlap (-0.3%) 91,714 ops/sec [91,045..92,259] → 89,404 ops/sec [87,081..89,425] 🔴 -2.5%
swap variables 493,046 ops/sec [488,572..506,712] → 470,318 ops/sec [467,888..472,418] 🔴 -4.6% 368,249 ops/sec [367,785..370,202] → 332,438 ops/sec [327,574..334,615] 🔴 -9.7%
simple object destructuring 302,653 ops/sec [297,087..304,588] → 287,674 ops/sec [283,773..292,799] 🔴 -4.9% 427,919 ops/sec [424,971..430,070] → 407,952 ops/sec [405,468..414,347] 🔴 -4.7%
with defaults 336,230 ops/sec [335,305..337,906] → 328,150 ops/sec [326,441..328,761] 🔴 -2.4% 574,994 ops/sec [573,062..580,980] → 553,816 ops/sec [548,120..559,924] 🔴 -3.7%
with renaming 315,911 ops/sec [314,640..316,054] → 313,053 ops/sec [311,294..315,902] ~ overlap (-0.9%) 467,953 ops/sec [466,355..478,751] → 439,623 ops/sec [435,417..444,019] 🔴 -6.1%
nested object destructuring 152,328 ops/sec [151,835..153,446] → 145,967 ops/sec [145,112..146,281] 🔴 -4.2% 200,891 ops/sec [199,799..201,519] → 196,154 ops/sec [194,444..199,932] ~ overlap (-2.4%)
rest properties 186,114 ops/sec [184,260..186,372] → 179,453 ops/sec [176,707..185,557] ~ overlap (-3.6%) 200,787 ops/sec [199,616..202,559] → 185,275 ops/sec [184,282..185,834] 🔴 -7.7%
object parameter 93,922 ops/sec [93,567..95,158] → 90,375 ops/sec [89,298..90,826] 🔴 -3.8% 155,889 ops/sec [155,146..156,779] → 147,288 ops/sec [144,818..148,398] 🔴 -5.5%
array parameter 121,364 ops/sec [120,769..122,622] → 116,726 ops/sec [115,892..119,574] 🔴 -3.8% 122,439 ops/sec [122,024..122,851] → 108,460 ops/sec [107,957..109,036] 🔴 -11.4%
mixed destructuring in map 33,540 ops/sec [33,154..33,738] → 32,583 ops/sec [32,338..32,748] 🔴 -2.9% 37,159 ops/sec [36,943..37,214] → 34,781 ops/sec [34,277..34,999] 🔴 -6.4%
forEach with array destructuring 63,671 ops/sec [63,011..64,088] → 61,628 ops/sec [60,796..62,089] 🔴 -3.2% 47,833 ops/sec [47,460..48,110] → 41,460 ops/sec [41,313..41,740] 🔴 -13.3%
map with array destructuring 63,324 ops/sec [62,703..63,799] → 61,059 ops/sec [60,414..61,684] 🔴 -3.6% 45,799 ops/sec [45,573..46,187] → 41,065 ops/sec [39,970..41,259] 🔴 -10.3%
filter with array destructuring 66,034 ops/sec [65,062..66,548] → 63,738 ops/sec [63,021..63,902] 🔴 -3.5% 53,084 ops/sec [52,940..53,716] → 47,848 ops/sec [47,597..48,477] 🔴 -9.9%
reduce with array destructuring 73,112 ops/sec [72,395..73,530] → 70,386 ops/sec [69,403..70,738] 🔴 -3.7% 50,160 ops/sec [49,721..50,259] → 45,106 ops/sec [43,883..45,766] 🔴 -10.1%
map with object destructuring 73,629 ops/sec [73,203..73,838] → 72,604 ops/sec [71,830..74,108] ~ overlap (-1.4%) 98,300 ops/sec [97,899..98,773] → 88,232 ops/sec [87,812..88,544] 🔴 -10.2%
map with nested destructuring 61,497 ops/sec [60,852..62,142] → 60,441 ops/sec [59,006..60,951] ~ overlap (-1.7%) 93,795 ops/sec [93,281..94,288] → 83,884 ops/sec [83,283..84,928] 🔴 -10.6%
map with rest in destructuring 42,444 ops/sec [42,062..42,669] → 40,642 ops/sec [40,570..40,824] 🔴 -4.2% 27,040 ops/sec [26,831..27,109] → 23,679 ops/sec [23,327..23,819] 🔴 -12.4%
map with defaults in destructuring 56,808 ops/sec [56,272..57,406] → 55,680 ops/sec [55,452..55,856] 🔴 -2.0% 70,579 ops/sec [70,358..70,778] → 63,716 ops/sec [62,713..65,107] 🔴 -9.7%
fibonacci.js — Interp: 🟢 1, 7 unch. · avg +0.4% · Bytecode: 🔴 8 · avg -12.7%
Benchmark Interpreted Δ Bytecode Δ
recursive fib(15) 325 ops/sec [323..329] → 323 ops/sec [322..324] ~ overlap (-0.7%) 958 ops/sec [953..960] → 807 ops/sec [807..808] 🔴 -15.7%
recursive fib(20) 30 ops/sec [29..30] → 30 ops/sec [30..30] ~ overlap (+0.2%) 86 ops/sec [86..86] → 74 ops/sec [73..74] 🔴 -14.4%
recursive fib(15) typed 331 ops/sec [325..337] → 339 ops/sec [338..340] 🟢 +2.6% 979 ops/sec [978..985] → 858 ops/sec [855..860] 🔴 -12.4%
recursive fib(20) typed 30 ops/sec [29..30] → 30 ops/sec [30..30] ~ overlap (+1.2%) 90 ops/sec [90..90] → 78 ops/sec [78..78] 🔴 -13.2%
iterative fib(20) via reduce 12,188 ops/sec [12,128..12,301] → 12,354 ops/sec [12,295..12,419] ~ overlap (+1.4%) 19,259 ops/sec [19,219..19,327] → 17,421 ops/sec [17,098..17,526] 🔴 -9.5%
iterator fib(20) 9,689 ops/sec [9,430..9,728] → 9,663 ops/sec [9,623..9,756] ~ overlap (-0.3%) 19,523 ops/sec [19,317..19,751] → 17,499 ops/sec [17,336..17,690] 🔴 -10.4%
iterator fib(20) via Iterator.from + take 15,409 ops/sec [13,830..15,527] → 15,530 ops/sec [15,445..15,692] ~ overlap (+0.8%) 22,124 ops/sec [21,965..22,375] → 20,434 ops/sec [20,227..20,580] 🔴 -7.6%
iterator fib(20) last value via reduce 11,835 ops/sec [11,737..11,898] → 11,618 ops/sec [11,501..11,742] ~ overlap (-1.8%) 16,197 ops/sec [16,113..16,243] → 13,194 ops/sec [13,178..13,422] 🔴 -18.5%
for-of.js — Interp: 🔴 1, 6 unch. · avg -0.9% · Bytecode: 🔴 7 · avg -6.0%
Benchmark Interpreted Δ Bytecode Δ
for...of with 10-element array 46,511 ops/sec [45,776..46,800] → 45,310 ops/sec [44,648..46,054] ~ overlap (-2.6%) 176,714 ops/sec [175,749..176,913] → 163,676 ops/sec [163,068..166,320] 🔴 -7.4%
for...of with 100-element array 5,347 ops/sec [5,305..5,393] → 5,207 ops/sec [5,182..5,254] 🔴 -2.6% 18,532 ops/sec [18,481..18,573] → 17,805 ops/sec [17,653..17,862] 🔴 -3.9%
for...of with string (10 chars) 34,197 ops/sec [33,173..34,639] → 34,447 ops/sec [34,334..34,717] ~ overlap (+0.7%) 91,542 ops/sec [91,264..91,711] → 85,390 ops/sec [84,183..87,008] 🔴 -6.7%
for...of with Set (10 elements) 46,203 ops/sec [45,614..46,309] → 45,968 ops/sec [45,438..46,479] ~ overlap (-0.5%) 164,393 ops/sec [164,160..165,038] → 153,897 ops/sec [152,784..154,472] 🔴 -6.4%
for...of with Map entries (10 entries) 29,939 ops/sec [29,513..29,983] → 29,689 ops/sec [29,445..29,759] ~ overlap (-0.8%) 29,473 ops/sec [29,340..29,657] → 28,318 ops/sec [28,037..28,555] 🔴 -3.9%
for...of with destructuring 39,607 ops/sec [39,118..39,987] → 39,439 ops/sec [38,808..39,658] ~ overlap (-0.4%) 39,056 ops/sec [38,955..39,203] → 35,476 ops/sec [35,353..35,554] 🔴 -9.2%
for-await-of with sync array 44,319 ops/sec [43,928..44,817] → 44,305 ops/sec [43,742..44,446] ~ overlap (-0.0%) 131,034 ops/sec [130,788..131,623] → 125,361 ops/sec [124,908..125,973] 🔴 -4.3%
helpers/bench-module.js — Interp: 0 · Bytecode: 0
Benchmark Interpreted Δ Bytecode Δ
iterators.js — Interp: 🟢 7, 13 unch. · avg +1.3% · Bytecode: 🔴 20 · avg -12.6%
Benchmark Interpreted Δ Bytecode Δ
Iterator.from({next}).toArray() — 20 elements 15,559 ops/sec [15,385..15,654] → 15,882 ops/sec [15,698..15,924] 🟢 +2.1% 21,958 ops/sec [21,543..22,078] → 19,277 ops/sec [19,075..19,649] 🔴 -12.2%
Iterator.from({next}).toArray() — 50 elements 6,650 ops/sec [6,584..6,741] → 6,876 ops/sec [6,858..6,878] 🟢 +3.4% 10,034 ops/sec [9,985..10,066] → 8,959 ops/sec [8,866..9,084] 🔴 -10.7%
spread pre-wrapped iterator — 20 elements 11,383 ops/sec [11,300..11,478] → 11,763 ops/sec [11,627..11,826] 🟢 +3.3% 21,092 ops/sec [20,809..21,167] → 18,573 ops/sec [18,382..18,651] 🔴 -11.9%
Iterator.from({next}).forEach — 50 elements 4,615 ops/sec [4,568..4,690] → 4,670 ops/sec [4,634..4,708] ~ overlap (+1.2%) 6,384 ops/sec [6,365..6,439] → 5,415 ops/sec [5,376..5,454] 🔴 -15.2%
Iterator.from({next}).reduce — 50 elements 4,709 ops/sec [4,632..4,771] → 4,765 ops/sec [4,730..4,826] ~ overlap (+1.2%) 6,363 ops/sec [6,329..6,450] → 5,291 ops/sec [5,261..5,381] 🔴 -16.9%
wrap array iterator 165,626 ops/sec [163,572..167,210] → 164,452 ops/sec [163,811..166,828] ~ overlap (-0.7%) 205,029 ops/sec [203,942..206,946] → 189,011 ops/sec [187,944..190,485] 🔴 -7.8%
wrap plain {next()} object 10,756 ops/sec [10,669..10,842] → 11,031 ops/sec [10,922..11,123] 🟢 +2.6% 15,912 ops/sec [15,815..15,991] → 14,480 ops/sec [14,437..14,507] 🔴 -9.0%
map + toArray (50 elements) 4,671 ops/sec [4,600..4,731] → 4,745 ops/sec [4,721..4,818] ~ overlap (+1.6%) 6,560 ops/sec [6,541..6,592] → 5,494 ops/sec [5,469..5,512] 🔴 -16.3%
filter + toArray (50 elements) 4,560 ops/sec [4,504..4,632] → 4,614 ops/sec [4,582..4,668] ~ overlap (+1.2%) 6,826 ops/sec [6,756..6,837] → 5,525 ops/sec [5,483..5,571] 🔴 -19.1%
take(10) + toArray (50 element source) 27,741 ops/sec [27,678..27,875] → 28,886 ops/sec [28,512..28,926] 🟢 +4.1% 37,766 ops/sec [37,595..37,886] → 35,820 ops/sec [35,421..36,151] 🔴 -5.2%
drop(40) + toArray (50 element source) 6,724 ops/sec [6,614..6,765] → 6,891 ops/sec [6,855..6,903] 🟢 +2.5% 9,955 ops/sec [9,932..9,983] → 8,603 ops/sec [8,557..8,729] 🔴 -13.6%
chained map + filter + take (100 element source) 8,302 ops/sec [8,239..8,341] → 8,519 ops/sec [8,405..8,559] 🟢 +2.6% 11,954 ops/sec [11,935..11,999] → 10,079 ops/sec [10,020..10,179] 🔴 -15.7%
some + every (50 elements) 2,699 ops/sec [2,648..2,709] → 2,715 ops/sec [2,683..2,729] ~ overlap (+0.6%) 3,939 ops/sec [3,926..3,944] → 3,116 ops/sec [3,105..3,132] 🔴 -20.9%
find (50 elements) 5,856 ops/sec [5,777..5,885] → 5,855 ops/sec [5,812..5,917] ~ overlap (-0.0%) 7,762 ops/sec [7,691..7,794] → 6,751 ops/sec [6,724..6,810] 🔴 -13.0%
array.values().map().filter().toArray() 8,252 ops/sec [8,159..8,300] → 8,241 ops/sec [8,172..8,319] ~ overlap (-0.1%) 11,029 ops/sec [11,003..11,057] → 9,748 ops/sec [9,705..9,782] 🔴 -11.6%
array.values().take(5).toArray() 212,669 ops/sec [211,560..214,525] → 215,320 ops/sec [213,767..216,124] ~ overlap (+1.2%) 255,272 ops/sec [254,310..256,918] → 231,116 ops/sec [230,686..232,428] 🔴 -9.5%
array.values().drop(45).toArray() 197,773 ops/sec [196,292..199,262] → 196,757 ops/sec [196,427..198,459] ~ overlap (-0.5%) 238,411 ops/sec [236,979..239,047] → 211,925 ops/sec [210,890..213,603] 🔴 -11.1%
map.entries() chained helpers 10,341 ops/sec [10,198..10,428] → 10,230 ops/sec [10,188..10,337] ~ overlap (-1.1%) 6,603 ops/sec [6,547..6,662] → 5,938 ops/sec [5,870..5,956] 🔴 -10.1%
set.values() chained helpers 17,329 ops/sec [17,241..17,455] → 17,446 ops/sec [17,266..17,568] ~ overlap (+0.7%) 22,650 ops/sec [22,539..22,657] → 19,800 ops/sec [19,664..19,819] 🔴 -12.6%
string iterator map + toArray 13,522 ops/sec [13,354..13,623] → 13,494 ops/sec [13,445..13,577] ~ overlap (-0.2%) 15,736 ops/sec [15,539..15,822] → 14,179 ops/sec [14,050..14,281] 🔴 -9.9%
json.js — Interp: 🟢 3, 🔴 2, 15 unch. · avg +0.0% · Bytecode: 🟢 1, 🔴 19 · avg -7.4%
Benchmark Interpreted Δ Bytecode Δ
parse simple object 174,016 ops/sec [172,305..174,807] → 169,823 ops/sec [167,991..170,771] 🔴 -2.4% 192,978 ops/sec [192,808..194,036] → 174,261 ops/sec [172,850..175,420] 🔴 -9.7%
parse nested object 107,123 ops/sec [106,518..107,710] → 104,490 ops/sec [103,716..105,559] 🔴 -2.5% 114,076 ops/sec [113,479..114,413] → 104,867 ops/sec [104,070..106,650] 🔴 -8.1%
parse array of objects 62,437 ops/sec [61,795..62,962] → 61,785 ops/sec [61,382..62,267] ~ overlap (-1.0%) 68,270 ops/sec [67,761..68,514] → 63,528 ops/sec [62,934..63,797] 🔴 -6.9%
parse large flat object 67,978 ops/sec [67,017..69,051] → 68,447 ops/sec [67,594..69,766] ~ overlap (+0.7%) 76,847 ops/sec [76,808..76,944] → 69,575 ops/sec [68,118..70,041] 🔴 -9.5%
parse mixed types 77,936 ops/sec [77,668..80,175] → 78,710 ops/sec [78,323..79,176] ~ overlap (+1.0%) 88,882 ops/sec [88,839..88,968] → 78,264 ops/sec [77,337..78,571] 🔴 -11.9%
stringify simple object 196,570 ops/sec [192,698..198,691] → 197,152 ops/sec [196,756..198,596] ~ overlap (+0.3%) 231,748 ops/sec [230,779..234,220] → 212,818 ops/sec [212,012..214,805] 🔴 -8.2%
stringify nested object 111,125 ops/sec [109,993..112,138] → 110,626 ops/sec [109,591..111,097] ~ overlap (-0.4%) 120,927 ops/sec [119,766..121,280] → 115,591 ops/sec [113,775..116,941] 🔴 -4.4%
stringify array of objects 61,367 ops/sec [60,702..61,576] → 62,599 ops/sec [62,483..62,771] 🟢 +2.0% 61,101 ops/sec [61,059..61,357] → 63,878 ops/sec [63,216..63,959] 🟢 +4.5%
stringify mixed types 88,747 ops/sec [88,296..89,210] → 88,323 ops/sec [88,013..88,793] ~ overlap (-0.5%) 95,636 ops/sec [95,284..95,810] → 90,085 ops/sec [89,039..90,386] 🔴 -5.8%
reviver doubles numbers 48,827 ops/sec [47,877..49,248] → 48,759 ops/sec [47,770..49,294] ~ overlap (-0.1%) 56,096 ops/sec [54,737..58,849] → 52,212 ops/sec [50,302..53,512] 🔴 -6.9%
reviver filters properties 40,990 ops/sec [40,752..41,071] → 41,048 ops/sec [40,758..41,225] ~ overlap (+0.1%) 48,234 ops/sec [47,927..48,604] → 42,907 ops/sec [42,602..43,254] 🔴 -11.0%
reviver on nested object 52,120 ops/sec [51,810..52,899] → 52,291 ops/sec [51,909..52,863] ~ overlap (+0.3%) 58,849 ops/sec [58,211..59,023] → 54,345 ops/sec [53,521..54,852] 🔴 -7.7%
reviver on array 32,390 ops/sec [31,188..32,649] → 32,230 ops/sec [30,843..32,524] ~ overlap (-0.5%) 37,050 ops/sec [35,988..37,444] → 32,812 ops/sec [32,706..32,891] 🔴 -11.4%
replacer function doubles numbers 47,500 ops/sec [47,180..48,129] → 47,490 ops/sec [47,371..47,540] ~ overlap (-0.0%) 57,149 ops/sec [57,037..57,416] → 51,073 ops/sec [50,758..51,417] 🔴 -10.6%
replacer function excludes properties 60,535 ops/sec [60,326..60,842] → 60,917 ops/sec [60,848..60,997] 🟢 +0.6% 67,360 ops/sec [66,693..67,613] → 61,575 ops/sec [61,046..62,042] 🔴 -8.6%
array replacer (allowlist) 113,086 ops/sec [112,481..114,008] → 113,455 ops/sec [111,794..114,416] ~ overlap (+0.3%) 129,464 ops/sec [128,575..129,716] → 118,096 ops/sec [116,443..119,604] 🔴 -8.8%
stringify with 2-space indent 97,136 ops/sec [96,472..97,340] → 95,103 ops/sec [93,084..97,166] ~ overlap (-2.1%) 105,268 ops/sec [104,808..105,440] → 101,242 ops/sec [100,558..102,893] 🔴 -3.8%
stringify with tab indent 96,325 ops/sec [96,030..97,116] → 97,230 ops/sec [95,166..98,599] ~ overlap (+0.9%) 108,214 ops/sec [108,014..108,417] → 101,741 ops/sec [100,478..102,478] 🔴 -6.0%
parse then stringify 55,610 ops/sec [55,422..56,352] → 56,792 ops/sec [56,398..57,078] 🟢 +2.1% 62,659 ops/sec [62,256..63,328] → 58,337 ops/sec [58,090..58,596] 🔴 -6.9%
stringify then parse 34,306 ops/sec [34,077..35,040] → 34,792 ops/sec [34,681..34,899] ~ overlap (+1.4%) 38,731 ops/sec [38,537..38,768] → 36,021 ops/sec [35,809..36,340] 🔴 -7.0%
jsx.jsx — Interp: 🔴 6, 15 unch. · avg -0.9% · Bytecode: 🔴 18, 3 unch. · avg -3.6%
Benchmark Interpreted Δ Bytecode Δ
simple element 210,383 ops/sec [207,400..210,899] → 212,051 ops/sec [207,184..212,974] ~ overlap (+0.8%) 323,526 ops/sec [322,516..324,775] → 317,448 ops/sec [316,511..318,762] 🔴 -1.9%
self-closing element 219,434 ops/sec [217,637..220,756] → 219,414 ops/sec [216,604..221,965] ~ overlap (-0.0%) 369,840 ops/sec [367,047..371,571] → 355,945 ops/sec [352,992..357,501] 🔴 -3.8%
element with string attribute 177,193 ops/sec [175,821..177,982] → 174,509 ops/sec [173,958..175,108] 🔴 -1.5% 258,109 ops/sec [256,007..258,835] → 251,325 ops/sec [248,726..252,762] 🔴 -2.6%
element with multiple attributes 157,621 ops/sec [156,826..158,098] → 153,790 ops/sec [146,065..155,259] 🔴 -2.4% 208,001 ops/sec [207,474..209,108] → 202,054 ops/sec [200,032..204,308] 🔴 -2.9%
element with expression attribute 167,960 ops/sec [167,345..168,476] → 163,321 ops/sec [162,843..164,168] 🔴 -2.8% 258,894 ops/sec [258,600..261,574] → 251,356 ops/sec [249,000..252,322] 🔴 -2.9%
text child 209,840 ops/sec [209,125..212,962] → 210,266 ops/sec [209,616..211,298] ~ overlap (+0.2%) 342,525 ops/sec [340,426..343,793] → 327,486 ops/sec [326,093..329,394] 🔴 -4.4%
expression child 205,460 ops/sec [204,365..206,086] → 206,901 ops/sec [204,231..207,983] ~ overlap (+0.7%) 331,751 ops/sec [328,732..333,286] → 319,767 ops/sec [316,995..325,068] 🔴 -3.6%
mixed text and expression 195,027 ops/sec [194,557..197,800] → 196,623 ops/sec [195,457..197,539] ~ overlap (+0.8%) 301,727 ops/sec [300,405..302,315] → 284,127 ops/sec [281,126..286,869] 🔴 -5.8%
nested elements (3 levels) 80,402 ops/sec [79,479..81,147] → 79,490 ops/sec [78,679..79,978] ~ overlap (-1.1%) 124,657 ops/sec [124,195..124,848] → 118,854 ops/sec [118,247..120,406] 🔴 -4.7%
sibling children 60,127 ops/sec [59,872..60,445] → 59,970 ops/sec [59,565..60,142] ~ overlap (-0.3%) 93,769 ops/sec [93,349..94,347] → 88,447 ops/sec [87,612..89,066] 🔴 -5.7%
component element 150,384 ops/sec [149,905..151,765] → 149,371 ops/sec [148,436..150,247] ~ overlap (-0.7%) 227,712 ops/sec [226,813..230,491] → 226,615 ops/sec [223,091..227,316] ~ overlap (-0.5%)
component with children 92,565 ops/sec [92,227..92,866] → 92,829 ops/sec [92,540..93,060] ~ overlap (+0.3%) 142,284 ops/sec [141,567..142,809] → 135,012 ops/sec [134,245..137,167] 🔴 -5.1%
dotted component 126,733 ops/sec [125,554..127,561] → 126,481 ops/sec [125,724..127,403] ~ overlap (-0.2%) 179,645 ops/sec [179,067..180,330] → 172,816 ops/sec [170,933..174,197] 🔴 -3.8%
empty fragment 222,771 ops/sec [222,054..225,850] → 219,268 ops/sec [218,359..221,199] 🔴 -1.6% 390,725 ops/sec [383,896..393,374] → 374,890 ops/sec [367,633..379,397] 🔴 -4.1%
fragment with children 59,597 ops/sec [59,413..59,835] → 59,428 ops/sec [58,291..60,016] ~ overlap (-0.3%) 91,153 ops/sec [90,939..91,249] → 88,405 ops/sec [88,027..88,470] 🔴 -3.0%
spread attributes 111,920 ops/sec [110,880..112,942] → 110,389 ops/sec [109,984..111,317] ~ overlap (-1.4%) 141,113 ops/sec [139,928..141,992] → 136,375 ops/sec [135,524..137,491] 🔴 -3.4%
spread with overrides 97,307 ops/sec [96,779..97,477] → 95,645 ops/sec [94,855..96,039] 🔴 -1.7% 120,500 ops/sec [118,929..120,957] → 115,192 ops/sec [114,030..117,136] 🔴 -4.4%
shorthand props 162,603 ops/sec [162,113..162,863] → 158,741 ops/sec [157,114..159,228] 🔴 -2.4% 240,062 ops/sec [238,243..240,982] → 235,043 ops/sec [231,716..240,856] ~ overlap (-2.1%)
nav bar structure 28,267 ops/sec [27,339..28,423] → 27,482 ops/sec [27,354..27,793] ~ overlap (-2.8%) 41,316 ops/sec [41,253..41,514] → 39,281 ops/sec [38,914..39,661] 🔴 -4.9%
card component tree 32,374 ops/sec [31,746..32,704] → 31,885 ops/sec [31,491..32,054] ~ overlap (-1.5%) 46,404 ops/sec [46,081..46,524] → 46,958 ops/sec [45,708..47,034] ~ overlap (+1.2%)
10 list items via Array.from 14,871 ops/sec [14,606..15,022] → 14,642 ops/sec [14,516..14,736] ~ overlap (-1.5%) 19,942 ops/sec [19,870..19,969] → 18,579 ops/sec [18,492..18,786] 🔴 -6.8%
modules.js — Interp: 🔴 5, 4 unch. · avg -1.9% · Bytecode: 🔴 8, 1 unch. · avg -8.2%
Benchmark Interpreted Δ Bytecode Δ
call imported function 480,318 ops/sec [474,980..481,258] → 461,952 ops/sec [454,834..466,672] 🔴 -3.8% 637,419 ops/sec [633,846..649,749] → 642,732 ops/sec [637,336..645,038] ~ overlap (+0.8%)
call two imported functions 269,701 ops/sec [265,073..272,638] → 260,041 ops/sec [257,471..261,194] 🔴 -3.6% 362,256 ops/sec [357,723..364,459] → 355,908 ops/sec [354,581..357,296] 🔴 -1.8%
read imported constant 1,638,335 ops/sec [1,631,383..1,649,129] → 1,595,172 ops/sec [1,590,788..1,616,285] 🔴 -2.6% 4,108,713 ops/sec [4,103,523..4,112,715] → 3,673,418 ops/sec [3,666,308..3,680,802] 🔴 -10.6%
read imported string 1,594,126 ops/sec [1,584,348..1,601,834] → 1,603,649 ops/sec [1,596,372..1,612,679] ~ overlap (+0.6%) 4,109,933 ops/sec [4,103,668..4,117,146] → 3,683,494 ops/sec [3,677,774..3,686,209] 🔴 -10.4%
read JSON string property 1,636,034 ops/sec [1,619,360..1,651,678] → 1,599,828 ops/sec [1,591,251..1,605,383] 🔴 -2.2% 4,076,285 ops/sec [4,074,339..4,080,505] → 3,662,634 ops/sec [3,650,223..3,681,949] 🔴 -10.1%
read JSON number property 1,596,774 ops/sec [1,589,498..1,611,331] → 1,584,810 ops/sec [1,582,606..1,597,270] ~ overlap (-0.7%) 4,110,576 ops/sec [4,101,613..4,113,586] → 3,690,847 ops/sec [3,688,096..3,700,867] 🔴 -10.2%
read JSON boolean property 1,632,399 ops/sec [1,622,103..1,657,687] → 1,592,665 ops/sec [1,575,994..1,600,006] 🔴 -2.4% 4,111,840 ops/sec [4,107,037..4,116,005] → 3,685,491 ops/sec [3,681,726..3,688,921] 🔴 -10.4%
read JSON array property 1,630,359 ops/sec [1,546,170..1,655,204] → 1,584,196 ops/sec [1,561,584..1,603,546] ~ overlap (-2.8%) 4,114,615 ops/sec [4,107,389..4,116,437] → 3,691,631 ops/sec [3,673,332..3,698,913] 🔴 -10.3%
read multiple JSON properties 930,814 ops/sec [924,903..935,458] → 932,017 ops/sec [927,539..945,167] ~ overlap (+0.1%) 3,748,977 ops/sec [3,745,265..3,752,488] → 3,329,726 ops/sec [3,325,319..3,331,550] 🔴 -11.2%
numbers.js — Interp: 🔴 6, 5 unch. · avg -2.6% · Bytecode: 🔴 11 · avg -10.2%
Benchmark Interpreted Δ Bytecode Δ
integer arithmetic 518,683 ops/sec [509,375..533,050] → 484,887 ops/sec [482,609..485,300] 🔴 -6.5% 1,762,920 ops/sec [1,760,824..1,763,839] → 1,451,843 ops/sec [1,422,213..1,455,656] 🔴 -17.6%
floating point arithmetic 592,826 ops/sec [589,509..597,755] → 583,635 ops/sec [578,651..591,239] ~ overlap (-1.6%) 1,276,611 ops/sec [1,275,384..1,279,424] → 968,114 ops/sec [966,974..970,657] 🔴 -24.2%
number coercion 191,551 ops/sec [190,481..193,008] → 189,882 ops/sec [186,561..192,691] ~ overlap (-0.9%) 244,368 ops/sec [243,961..244,916] → 221,183 ops/sec [220,837..221,807] 🔴 -9.5%
toFixed 100,895 ops/sec [100,064..101,577] → 100,065 ops/sec [99,318..100,962] ~ overlap (-0.8%) 122,407 ops/sec [120,802..123,100] → 110,735 ops/sec [110,100..111,243] 🔴 -9.5%
toString 156,717 ops/sec [154,856..157,992] → 151,116 ops/sec [150,650..153,497] 🔴 -3.6% 199,776 ops/sec [198,994..200,250] → 186,770 ops/sec [185,492..188,799] 🔴 -6.5%
valueOf 230,266 ops/sec [224,405..233,293] → 224,334 ops/sec [220,173..225,040] ~ overlap (-2.6%) 289,190 ops/sec [288,182..290,234] → 268,411 ops/sec [266,474..269,970] 🔴 -7.2%
toPrecision 145,114 ops/sec [144,159..146,212] → 142,184 ops/sec [141,342..143,335] 🔴 -2.0% 171,868 ops/sec [171,343..172,091] → 169,216 ops/sec [169,008..170,020] 🔴 -1.5%
Number.isNaN 321,359 ops/sec [320,016..322,393] → 321,899 ops/sec [319,709..323,574] ~ overlap (+0.2%) 365,282 ops/sec [363,242..366,716] → 333,302 ops/sec [331,873..334,187] 🔴 -8.8%
Number.isFinite 325,524 ops/sec [313,625..326,962] → 311,714 ops/sec [310,985..312,742] 🔴 -4.2% 343,024 ops/sec [342,802..343,919] → 319,704 ops/sec [318,465..321,912] 🔴 -6.8%
Number.isInteger 326,493 ops/sec [324,104..330,001] → 320,584 ops/sec [317,202..324,052] 🔴 -1.8% 383,790 ops/sec [370,453..385,482] → 340,668 ops/sec [338,943..340,990] 🔴 -11.2%
Number.parseInt and parseFloat 257,048 ops/sec [249,396..260,034] → 244,597 ops/sec [244,007..245,828] 🔴 -4.8% 290,199 ops/sec [289,916..290,449] → 263,671 ops/sec [261,307..267,081] 🔴 -9.1%
objects.js — Interp: 🔴 4, 3 unch. · avg -2.8% · Bytecode: 🔴 6, 1 unch. · avg -3.2%
Benchmark Interpreted Δ Bytecode Δ
create simple object 491,357 ops/sec [483,171..500,527] → 455,418 ops/sec [453,231..459,633] 🔴 -7.3% 570,807 ops/sec [569,330..571,199] → 556,372 ops/sec [552,956..561,154] 🔴 -2.5%
create nested object 235,544 ops/sec [234,717..236,911] → 225,224 ops/sec [224,281..226,749] 🔴 -4.4% 263,544 ops/sec [262,319..264,248] → 251,238 ops/sec [250,401..253,660] 🔴 -4.7%
create 50 objects via Array.from 9,274 ops/sec [9,196..9,386] → 9,278 ops/sec [9,119..9,294] ~ overlap (+0.0%) 10,168 ops/sec [10,134..10,228] → 9,789 ops/sec [9,687..9,869] 🔴 -3.7%
property read 552,058 ops/sec [547,376..557,612] → 558,189 ops/sec [555,611..561,467] ~ overlap (+1.1%) 442,642 ops/sec [441,956..443,815] → 438,778 ops/sec [436,886..441,968] ~ overlap (-0.9%)
Object.keys 288,900 ops/sec [284,395..291,771] → 281,532 ops/sec [279,927..281,773] 🔴 -2.6% 333,891 ops/sec [333,227..334,155] → 308,041 ops/sec [305,044..311,948] 🔴 -7.7%
Object.entries 105,518 ops/sec [104,103..106,238] → 104,106 ops/sec [103,733..105,006] ~ overlap (-1.3%) 114,175 ops/sec [113,769..114,773] → 112,825 ops/sec [112,378..113,457] 🔴 -1.2%
spread operator 180,968 ops/sec [179,709..182,534] → 171,777 ops/sec [171,101..173,057] 🔴 -5.1% 210,751 ops/sec [209,660..211,735] → 206,760 ops/sec [205,413..207,531] 🔴 -1.9%
promises.js — Interp: 🔴 3, 9 unch. · avg -0.4% · Bytecode: 🔴 12 · avg -4.9%
Benchmark Interpreted Δ Bytecode Δ
Promise.resolve(value) 542,388 ops/sec [539,596..546,859] → 526,272 ops/sec [523,070..529,970] 🔴 -3.0% 587,855 ops/sec [586,455..589,949] → 554,497 ops/sec [550,861..558,154] 🔴 -5.7%
new Promise(resolve => resolve(value)) 191,677 ops/sec [191,076..192,115] → 190,911 ops/sec [187,803..192,871] ~ overlap (-0.4%) 236,737 ops/sec [233,015..239,954] → 224,613 ops/sec [223,464..227,136] 🔴 -5.1%
Promise.reject(reason) 549,461 ops/sec [543,256..551,538] → 536,930 ops/sec [531,252..540,335] 🔴 -2.3% 583,421 ops/sec [581,993..584,651] → 549,494 ops/sec [547,302..550,699] 🔴 -5.8%
resolve + then (1 handler) 177,968 ops/sec [175,347..179,426] → 177,530 ops/sec [176,749..178,828] ~ overlap (-0.2%) 209,375 ops/sec [208,915..209,567] → 197,158 ops/sec [196,216..197,960] 🔴 -5.8%
resolve + then chain (3 deep) 70,175 ops/sec [69,802..70,862] → 69,955 ops/sec [69,880..70,605] ~ overlap (-0.3%) 82,910 ops/sec [81,669..83,838] → 77,400 ops/sec [76,941..78,651] 🔴 -6.6%
resolve + then chain (10 deep) 22,169 ops/sec [22,069..22,643] → 22,528 ops/sec [22,322..22,834] ~ overlap (+1.6%) 25,912 ops/sec [25,367..26,127] → 24,872 ops/sec [24,810..24,924] 🔴 -4.0%
reject + catch + then 100,358 ops/sec [98,342..101,825] → 100,445 ops/sec [100,187..100,493] ~ overlap (+0.1%) 118,788 ops/sec [117,512..118,991] → 110,344 ops/sec [109,601..110,779] 🔴 -7.1%
resolve + finally + then 84,697 ops/sec [83,515..85,745] → 83,783 ops/sec [82,806..84,402] ~ overlap (-1.1%) 95,847 ops/sec [95,221..96,310] → 92,408 ops/sec [92,204..93,152] 🔴 -3.6%
Promise.all (5 resolved) 31,491 ops/sec [31,071..31,925] → 31,848 ops/sec [31,598..31,991] ~ overlap (+1.1%) 35,039 ops/sec [35,004..35,054] → 33,295 ops/sec [33,140..33,521] 🔴 -5.0%
Promise.race (5 resolved) 33,498 ops/sec [33,327..33,616] → 33,827 ops/sec [33,499..34,074] ~ overlap (+1.0%) 36,767 ops/sec [36,683..36,979] → 35,959 ops/sec [35,869..36,107] 🔴 -2.2%
Promise.allSettled (5 mixed) 26,537 ops/sec [26,409..26,928] → 26,832 ops/sec [26,778..26,907] ~ overlap (+1.1%) 29,205 ops/sec [28,894..29,255] → 27,910 ops/sec [27,719..27,992] 🔴 -4.4%
Promise.any (5 mixed) 32,101 ops/sec [32,030..32,230] → 31,494 ops/sec [31,265..31,551] 🔴 -1.9% 34,455 ops/sec [34,346..34,503] → 33,172 ops/sec [33,018..33,326] 🔴 -3.7%
strings.js — Interp: 🟢 1, 🔴 5, 5 unch. · avg -0.5% · Bytecode: 🟢 1, 🔴 9, 1 unch. · avg -2.6%
Benchmark Interpreted Δ Bytecode Δ
string concatenation 408,262 ops/sec [406,978..409,835] → 396,675 ops/sec [395,668..397,046] 🔴 -2.8% 298,311 ops/sec [297,700..299,833] → 325,677 ops/sec [324,331..328,034] 🟢 +9.2%
template literal 616,385 ops/sec [612,755..617,927] → 663,361 ops/sec [655,997..673,817] 🟢 +7.6% 650,554 ops/sec [649,400..653,806] → 651,540 ops/sec [648,992..654,968] ~ overlap (+0.2%)
string repeat 404,435 ops/sec [403,536..407,217] → 396,554 ops/sec [393,871..398,480] 🔴 -1.9% 492,533 ops/sec [487,413..494,271] → 465,833 ops/sec [464,268..470,006] 🔴 -5.4%
split and join 139,583 ops/sec [135,887..140,192] → 137,456 ops/sec [137,167..138,232] ~ overlap (-1.5%) 159,056 ops/sec [158,411..160,874] → 155,349 ops/sec [154,209..156,787] 🔴 -2.3%
indexOf and includes 166,953 ops/sec [165,812..167,878] → 167,443 ops/sec [164,024..168,305] ~ overlap (+0.3%) 206,393 ops/sec [204,544..208,916] → 193,579 ops/sec [192,734..194,449] 🔴 -6.2%
toUpperCase and toLowerCase 252,726 ops/sec [250,956..254,167] → 247,923 ops/sec [244,038..250,990] ~ overlap (-1.9%) 340,275 ops/sec [339,929..343,010] → 329,588 ops/sec [328,124..332,580] 🔴 -3.1%
slice and substring 152,536 ops/sec [152,109..155,913] → 150,854 ops/sec [150,408..151,476] 🔴 -1.1% 206,848 ops/sec [206,598..207,374] → 198,393 ops/sec [195,305..199,996] 🔴 -4.1%
trim operations 185,839 ops/sec [183,347..186,509] → 182,354 ops/sec [181,260..183,256] 🔴 -1.9% 246,979 ops/sec [246,247..248,207] → 241,592 ops/sec [239,620..242,424] 🔴 -2.2%
replace and replaceAll 210,537 ops/sec [209,346..211,125] → 208,052 ops/sec [206,752..209,053] 🔴 -1.2% 253,316 ops/sec [252,459..253,839] → 241,926 ops/sec [239,806..246,394] 🔴 -4.5%
startsWith and endsWith 132,942 ops/sec [132,492..133,090] → 133,032 ops/sec [131,856..134,518] ~ overlap (+0.1%) 168,876 ops/sec [168,228..169,531] → 159,484 ops/sec [158,021..161,205] 🔴 -5.6%
padStart and padEnd 194,154 ops/sec [191,023..194,798] → 191,263 ops/sec [189,844..193,360] ~ overlap (-1.5%) 244,894 ops/sec [243,013..245,580] → 234,066 ops/sec [227,388..235,672] 🔴 -4.4%
typed-arrays.js — Interp: 🟢 4, 🔴 11, 7 unch. · avg -1.4% · Bytecode: 🟢 1, 🔴 21 · avg -8.7%
Benchmark Interpreted Δ Bytecode Δ
new Int32Array(0) 331,890 ops/sec [330,144..334,644] → 320,290 ops/sec [318,934..320,749] 🔴 -3.5% 390,540 ops/sec [388,151..390,583] → 369,581 ops/sec [367,276..371,338] 🔴 -5.4%
new Int32Array(100) 304,689 ops/sec [301,890..308,335] → 291,895 ops/sec [288,019..294,860] 🔴 -4.2% 354,490 ops/sec [352,813..355,441] → 336,276 ops/sec [335,788..341,163] 🔴 -5.1%
new Int32Array(1000) 183,682 ops/sec [183,052..185,088] → 175,624 ops/sec [174,575..176,907] 🔴 -4.4% 225,700 ops/sec [223,962..226,208] → 195,055 ops/sec [192,265..196,056] 🔴 -13.6%
new Float64Array(100) 276,911 ops/sec [274,601..277,755] → 263,536 ops/sec [262,830..266,126] 🔴 -4.8% 339,187 ops/sec [337,367..341,273] → 305,193 ops/sec [303,984..306,856] 🔴 -10.0%
Int32Array.from([...]) 183,282 ops/sec [179,355..185,322] → 180,381 ops/sec [178,896..180,912] ~ overlap (-1.6%) 214,568 ops/sec [213,926..215,887] → 195,321 ops/sec [193,752..197,551] 🔴 -9.0%
Int32Array.of(1, 2, 3, 4, 5) 311,950 ops/sec [309,684..312,398] → 297,229 ops/sec [294,420..298,267] 🔴 -4.7% 352,698 ops/sec [349,842..354,876] → 363,107 ops/sec [359,613..365,236] 🟢 +3.0%
sequential write 100 elements 3,529 ops/sec [3,524..3,555] → 3,462 ops/sec [3,417..3,519] 🔴 -1.9% 17,526 ops/sec [17,380..17,628] → 15,409 ops/sec [15,345..15,444] 🔴 -12.1%
sequential read 100 elements 3,570 ops/sec [3,541..3,600] → 3,564 ops/sec [3,546..3,567] ~ overlap (-0.2%) 11,561 ops/sec [11,531..11,584] → 10,983 ops/sec [10,910..10,996] 🔴 -5.0%
Float64Array write 100 elements 3,271 ops/sec [3,223..3,286] → 3,236 ops/sec [3,211..3,239] ~ overlap (-1.1%) 12,852 ops/sec [12,733..12,898] → 10,896 ops/sec [10,751..11,031] 🔴 -15.2%
fill(42) 46,523 ops/sec [45,617..46,826] → 48,310 ops/sec [48,217..48,362] 🟢 +3.8% 59,683 ops/sec [59,509..59,752] → 48,725 ops/sec [48,682..48,804] 🔴 -18.4%
slice() 197,321 ops/sec [196,527..200,482] → 202,636 ops/sec [201,757..203,762] 🟢 +2.7% 241,384 ops/sec [240,479..242,425] → 221,884 ops/sec [221,709..222,036] 🔴 -8.1%
map(x => x * 2) 8,022 ops/sec [8,009..8,128] → 7,852 ops/sec [7,756..7,876] 🔴 -2.1% 9,651 ops/sec [9,631..9,676] → 8,866 ops/sec [8,827..8,936] 🔴 -8.1%
filter(x => x > 50) 8,451 ops/sec [8,296..8,474] → 8,267 ops/sec [8,089..8,369] ~ overlap (-2.2%) 10,532 ops/sec [10,489..10,642] → 9,716 ops/sec [9,650..9,767] 🔴 -7.7%
reduce (sum) 7,853 ops/sec [7,726..7,875] → 7,907 ops/sec [7,836..8,008] ~ overlap (+0.7%) 7,923 ops/sec [7,894..7,927] → 7,415 ops/sec [7,370..7,536] 🔴 -6.4%
sort() 171,376 ops/sec [170,896..171,658] → 165,257 ops/sec [164,768..166,239] 🔴 -3.6% 208,059 ops/sec [207,540..208,390] → 178,086 ops/sec [177,609..178,243] 🔴 -14.4%
indexOf() 422,432 ops/sec [418,715..423,607] → 423,654 ops/sec [417,763..430,718] ~ overlap (+0.3%) 550,352 ops/sec [548,392..551,806] → 487,841 ops/sec [486,870..488,221] 🔴 -11.4%
reverse() 321,898 ops/sec [321,146..323,087] → 324,291 ops/sec [323,975..324,616] 🟢 +0.7% 393,791 ops/sec [393,343..394,115] → 352,271 ops/sec [351,724..352,730] 🔴 -10.5%
create view over existing buffer 401,962 ops/sec [396,214..404,549] → 392,308 ops/sec [387,607..394,956] 🔴 -2.4% 473,615 ops/sec [472,441..475,608] → 440,894 ops/sec [437,648..444,447] 🔴 -6.9%
subarray() 420,311 ops/sec [415,680..425,478] → 414,957 ops/sec [413,085..418,565] ~ overlap (-1.3%) 532,944 ops/sec [530,885..534,482] → 521,608 ops/sec [517,737..525,027] 🔴 -2.1%
set() from array 555,995 ops/sec [553,648..561,668] → 571,941 ops/sec [570,822..572,738] 🟢 +2.9% 683,714 ops/sec [682,107..684,050] → 635,887 ops/sec [634,932..636,602] 🔴 -7.0%
for-of loop 4,986 ops/sec [4,976..4,998] → 4,904 ops/sec [4,844..4,938] 🔴 -1.6% 19,791 ops/sec [19,715..19,897] → 17,979 ops/sec [17,871..18,041] 🔴 -9.2%
spread into array 17,116 ops/sec [17,059..17,188] → 16,843 ops/sec [16,762..16,874] 🔴 -1.6% 101,733 ops/sec [101,507..102,158] → 92,968 ops/sec [91,760..96,283] 🔴 -8.6%

Measured on ubuntu-latest x64. Benchmark ranges compare cached main-branch min/max ops/sec with the PR run; overlapping ranges are treated as unchanged noise. Percentage deltas are secondary context.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/pr.yml:
- Around line 396-405: calculateChange can return null when baseEntry.opsPerSec
is zero which later leads fmtPercent(fmtDelta(...)) to call null.toFixed and
throw; fix by making fmtDelta (and/or fmtPercent) robust to null change values:
update fmtDelta to check if the change argument is null/undefined and return a
safe placeholder (e.g., 'N/A' or '-') instead of passing null through, and
update fmtPercent to guard against null before calling toFixed (return
placeholder when input is null). Reference functions: calculateChange, classify,
fmtDelta, fmtPercent.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8e30b9d7-8862-4bb3-b317-0d1e84f48835

📥 Commits

Reviewing files that changed from the base of the PR and between 0f48261 and 951e135.

📒 Files selected for processing (3)
  • .github/workflows/pr.yml
  • docs/benchmarks.md
  • docs/build-system.md

Comment thread .github/workflows/pr.yml
@frostney frostney merged commit d96f9a3 into main Mar 31, 2026
9 checks passed
@frostney frostney deleted the feature/pr-benchmark-range-comparison branch March 31, 2026 03:35
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.

Use range-based benchmark comparison instead of point values in PR comments

1 participant