Skip to content

Release fixes#91

Merged
benbernard merged 2 commits intomasterfrom
issue-cleanups
Feb 22, 2026
Merged

Release fixes#91
benbernard merged 2 commits intomasterfrom
issue-cleanups

Conversation

@benbernard
Copy link
Owner

No description provided.

benbernard and others added 2 commits February 22, 2026 06:59
The release GitHub Action was skipping the build and release jobs because
the check-version job found that release v0.1.0 already exists. Since
multiple changes have been merged since v0.1.0 (multiplex fixes,
benchmark improvements, new features), bump to 0.2.0 so the next merge
to master triggers a new release.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the manual version-check approach with automatic patch bumping.
The release workflow now determines the next version from the latest git
tag (falling back to package.json if no tags exist), stamps it into
package.json for the build artifacts, creates the tag, and publishes
the GitHub release. No manual version bumps needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@benbernard benbernard merged commit 2bf041c into master Feb 22, 2026
4 checks passed
@github-actions
Copy link

Performance Benchmark Results

⚠️ 11 regressions detected out of 103 benchmarks (threshold: 25%)

Benchmark Median Baseline Delta
KeySpec — simple key (name) 394.3µs 214.6µs +83.7% 🔴
chain — 5 ops (grep eval grep eval
implicit — 2 ops (grep eval), 100 records 143.2µs 71.5µs
chain — 2 ops (grep eval), 1K records 310.4µs 204.8µs
implicit — 3 ops (grep eval grep), 100 records 175.6µs
chain — 3 ops (grep eval grep), 1K records 303.4µs
implicit — 3 ops (grep eval grep), 1K records 309.0µs
chain — 3 ops (grep eval grep), 10K records 1.41ms
implicit — 3 ops (grep eval grep), 10K records 1.44ms
chain — 5 ops (grep eval grep eval
chain — 5 ops (grep eval grep eval

103 benchmarks: 11 faster, 14 slower, 78 within noise (10%)

ℹ️ Note: Benchmarks are advisory-only. GitHub Actions shared runners have variable performance, so results may fluctuate ±25% between runs. For reliable benchmarking, run locally with bun run bench.

Full benchmark results

JSON Parsing

Benchmark Median Baseline Delta Throughput
Record.fromJSON — 100 lines 151.9µs 152.8µs -0.6% 658.39K rec/s
Record.fromJSON — 10K lines 14.17ms 13.15ms +7.8% 705.61K rec/s, 209.0 MB/s
InputStream.fromString — 100 records 211.0µs 219.9µs -4.0% 473.86K rec/s
InputStream.fromString — 10K records 18.54ms 17.93ms +3.4% 539.40K rec/s, 159.7 MB/s
JSON.parse baseline — 10K lines (no Record) 12.74ms 12.95ms -1.6% 784.68K rec/s, 232.4 MB/s
JSON.parse single array — 10K records 12.70ms 13.32ms -4.7% 787.71K rec/s, 233.3 MB/s

JSON Serialization

Benchmark Median Baseline Delta Throughput
Record.toString — 100 records 82.6µs 86.2µs -4.1% 1.21M rec/s
Record.toString — 10K records 8.36ms 8.17ms +2.4% 1.20M rec/s, 354.1 MB/s
Record.toJSON — 10K records 288.3µs 282.4µs +2.1% 34.68M rec/s
JSON.stringify baseline — 10K objects (no Record) 7.85ms 7.89ms -0.5% 1.27M rec/s, 377.3 MB/s
Batch join — 10K records (map+join) 8.42ms 9.13ms -7.8% 1.19M rec/s, 351.6 MB/s

KeySpec Access

Benchmark Median Baseline Delta Throughput
KeySpec — simple key (name) 394.3µs 214.6µs +83.7% 🔴 25.36M rec/s
KeySpec — nested key (address/zip) 544.3µs 521.2µs +4.4% 18.37M rec/s
KeySpec — deep nested (address/coords/lat) 604.7µs 567.9µs +6.5% 16.54M rec/s
KeySpec — array index (tags/#0) 421.1µs 562.7µs -25.2% 🟢 23.75M rec/s
Direct property access baseline (rec['name']) 37.5µs 39.8µs -5.6% 266.38M rec/s
Direct nested access baseline (rec.address.coords.lat) 58.3µs 63.7µs -8.5% 171.46M rec/s
KeySpec construction — cached (same spec 10K times) 278.6µs 281.3µs -1.0% 35.90M rec/s
KeySpec construction — unique specs (10K different) 2.24ms 2.15ms +4.0% 4.47M rec/s
Compiled KeySpec.resolveValue — nested (address/zip) 165.2µs 305.0µs -45.8% 🟢 60.54M rec/s
Compiled KeySpec.resolveValue — deep (address/coords/lat) 123.8µs 232.1µs -46.7% 🟢 80.78M rec/s
Compiled KeySpec.resolveValue — array (tags/#0) 155.8µs 240.4µs -35.2% 🟢 64.17M rec/s
Compiled KeySpec.setValue — nested (address/zip) 203.4µs 162.9µs +24.9% 🔴 49.16M rec/s

Core Operations

Benchmark Median Baseline Delta Throughput
grep — 10K records (r.age > 50) 432.9µs 445.9µs -2.9% 23.10M rec/s
grep — 10K records (string match) 440.2µs 463.7µs -5.1% 22.72M rec/s
eval — 10K records (add computed field) 2.41ms 2.31ms +4.1% 4.16M rec/s
xform — 10K records (push each record) 2.79ms 2.88ms -3.0% 3.58M rec/s
sort — 100 records (by score, numeric) 162.6µs 172.5µs -5.8% 614.91K rec/s
sort — 10K records (by score, numeric) 17.57ms 18.52ms -5.2% 569.25K rec/s
sort — 10K records (by name, lexical) 11.92ms 12.20ms -2.3% 839.06K rec/s
collate — 100 records (count by city) 283.0µs 290.7µs -2.7% 353.40K rec/s
collate — 10K records (count by city) 11.61ms 12.23ms -5.1% 861.09K rec/s
fromcsv — 10K rows (parse CSV to records) 15.49ms 14.71ms +5.3% 645.46K rec/s, 42.4 MB/s

Pipeline Overhead

Benchmark Median Baseline Delta Throughput
chain — single op (grep), 10K records 7.07ms 6.98ms +1.2% 1.41M rec/s
chain — 3 ops (grep eval grep), 10K records 7.38ms 7.74ms
chain — 5 ops (grep eval grep eval grep), 10K records
passthrough baseline — 10K records (direct collector) 6.01ms 6.00ms +0.2% 1.66M rec/s

Record Creation & Serialization

Benchmark Median Baseline Delta Throughput
new Record() — 10K objects 97.1µs 93.1µs +4.3% 103.02M rec/s
new Record() empty — 10K 134.1µs 129.1µs +3.8% 74.57M rec/s
Record.get — 10K records × 3 fields 53.6µs 47.6µs +12.5% 🔴 559.91M rec/s
Record.set — 10K records × 1 field 59.9µs 61.1µs -2.1% 167.08M rec/s
Record.toJSON — 10K records 310.5µs 282.4µs +10.0% 32.21M rec/s
Record.toString — 10K records 8.43ms 8.17ms +3.1% 1.19M rec/s
Record.clone — 10K records 56.88ms 54.48ms +4.4% 175.81K rec/s
Record.fromJSON — 10K lines 13.08ms 13.15ms -0.5% 764.29K rec/s, 226.3 MB/s
Record.dataRef — 10K records (zero-copy) 38.0µs 38.3µs -0.7% 262.84M rec/s
Record.sort — 10K records (numeric field) 11.37ms 11.69ms -2.7% 879.30K rec/s
Record.sort — 10K records (lexical field) 6.00ms 6.09ms -1.4% 1.67M rec/s
Record.cmp — 1M comparisons (single field) 103.52ms 102.50ms +1.0% 9.66M rec/s
Record.sort — 10K records (nested field numeric) 15.33ms 15.75ms -2.7% 652.19K rec/s
Record.cmp — 1M comparisons (multi-field cached) 91.52ms 85.74ms +6.7% 10.93M rec/s
Record.sort — 10K records (cached comparator reuse) 11.59ms 11.84ms -2.1% 862.47K rec/s

Chain vs Pipe

Benchmark Median Baseline Delta Throughput
chain — 2 ops (grep eval), 100 records 115.2µs 152.5µs -24.4% 🟢
pipe — 2 ops (grep eval), 100 records 419.53ms 381.93ms +9.8%
implicit — 2 ops (grep eval), 100 records 143.2µs 71.5µs +100.2% 🔴
chain — 2 ops (grep eval), 1K records 310.4µs 204.8µs +51.6% 🔴
pipe — 2 ops (grep eval), 1K records 375.12ms 367.53ms +2.1%
implicit — 2 ops (grep eval), 1K records 290.6µs 301.9µs -3.8%
chain — 2 ops (grep eval), 10K records 1.08ms 1.37ms -21.1% 🟢
pipe — 2 ops (grep eval), 10K records 365.62ms 360.86ms +1.3%
implicit — 2 ops (grep eval), 10K records 1.07ms 1.09ms -2.0%
chain — 3 ops (grep eval grep), 100 records 98.3µs 156.0µs
pipe — 3 ops (grep eval grep), 100 records 533.68ms 552.79ms
implicit — 3 ops (grep eval grep), 100 records 175.6µs 113.2µs
chain — 3 ops (grep eval grep), 1K records 303.4µs 206.9µs
pipe — 3 ops (grep eval grep), 1K records 556.68ms 567.45ms
implicit — 3 ops (grep eval grep), 1K records 309.0µs 204.0µs
chain — 3 ops (grep eval grep), 10K records 1.41ms 1.07ms
pipe — 3 ops (grep eval grep), 10K records 570.39ms 551.81ms
implicit — 3 ops (grep eval grep), 10K records 1.44ms 1.09ms
chain — 5 ops (grep eval grep eval grep), 100 records
pipe — 5 ops (grep eval grep eval grep), 100 records
implicit — 5 ops (grep eval grep eval grep), 100 records
chain — 5 ops (grep eval grep eval grep), 1K records
pipe — 5 ops (grep eval grep eval grep), 1K records
implicit — 5 ops (grep eval grep eval grep), 1K records
chain — 5 ops (grep eval grep eval grep), 10K records
pipe — 5 ops (grep eval grep eval grep), 10K records
implicit — 5 ops (grep eval grep eval grep), 10K records

Line Reading

Benchmark Median Baseline Delta Throughput
InputStream.fromFile — 100 lines 490.4µs 495.3µs -1.0% 203.91K rec/s, 60.2 MB/s
InputStream.fromString — 100 lines 191.5µs 186.7µs +2.6% 522.15K rec/s, 154.2 MB/s
manual buffer (isolated) — 100 lines 314.5µs 261.2µs +20.4% 🔴 317.96K rec/s, 93.9 MB/s
bulk text + split — 100 lines 69.8µs 81.4µs -14.3% 🟢 1.43M rec/s, 423.3 MB/s
node readline — 100 lines 428.2µs 442.9µs -3.3% 233.53K rec/s, 69.0 MB/s
TextDecoderStream — 100 lines 255.2µs 243.3µs +4.9% 391.87K rec/s, 115.7 MB/s
binary newline scan — 100 lines 285.8µs 271.5µs +5.3% 349.88K rec/s, 103.3 MB/s
bun native stdin — 100 lines 25.79ms 26.17ms -1.5% 3.88K rec/s, 1.1 MB/s
InputStream.fromFile — 10K lines 24.24ms 23.88ms +1.5% 412.47K rec/s, 122.2 MB/s
InputStream.fromString — 10K lines 17.80ms 17.53ms +1.6% 561.66K rec/s, 166.3 MB/s
manual buffer (isolated) — 10K lines 6.21ms 6.72ms -7.6% 1.61M rec/s, 476.9 MB/s
bulk text + split — 10K lines 2.38ms 2.43ms -1.9% 4.19M rec/s, 1242.0 MB/s
node readline — 10K lines 9.34ms 9.29ms +0.5% 1.07M rec/s, 317.0 MB/s
TextDecoderStream — 10K lines 4.11ms 4.82ms -14.7% 🟢 2.43M rec/s, 719.9 MB/s
binary newline scan — 10K lines 7.48ms 10.33ms -27.6% 🟢 1.34M rec/s, 395.9 MB/s
bun native stdin — 10K lines 42.11ms 44.03ms -4.4% 237.48K rec/s, 70.3 MB/s
InputStream.fromFile — 100K lines 261.62ms 259.87ms +0.7% 382.23K rec/s, 113.6 MB/s
InputStream.fromString — 100K lines 216.34ms 214.28ms +1.0% 462.24K rec/s, 137.4 MB/s
manual buffer (isolated) — 100K lines 33.61ms 36.92ms -8.9% 2.97M rec/s, 884.0 MB/s
bulk text + split — 100K lines 29.18ms 26.97ms +8.2% 3.43M rec/s, 1018.4 MB/s
node readline — 100K lines 84.26ms 83.36ms +1.1% 1.19M rec/s, 352.6 MB/s
TextDecoderStream — 100K lines 42.24ms 39.47ms +7.0% 2.37M rec/s, 703.5 MB/s
binary newline scan — 100K lines 67.35ms 83.52ms -19.4% 🟢 1.48M rec/s, 441.2 MB/s
bun native stdin — 100K lines 124.95ms 114.59ms +9.0% 800.29K rec/s, 237.8 MB/s

benbernard added a commit that referenced this pull request Feb 23, 2026
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