Skip to content

Comments

Gitignore test-generated xlsx fixtures#99

Merged
benbernard merged 1 commit intomasterfrom
feature/gitignore-test-xlsx
Feb 25, 2026
Merged

Gitignore test-generated xlsx fixtures#99
benbernard merged 1 commit intomasterfrom
feature/gitignore-test-xlsx

Conversation

@benbernard
Copy link
Owner

Summary

  • Add test-generated xlsx files to .gitignore
  • Remove tests/fixtures/*.xlsx from git tracking (regenerated by fromxls tests in beforeAll)

🤖 Generated with Claude Code

@github-actions
Copy link

Performance Benchmark Results

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

Benchmark Median Baseline Delta
InputStream.fromString — 100 records 369.3µs 207.8µs +77.7% 🔴
KeySpec — deep nested (address/coords/lat) 1.14ms 562.4µs +101.9% 🔴
Direct property access baseline (rec['name']) 81.1µs 42.0µs +92.9% 🔴
collate — 100 records (count by city) 456.3µs 356.1µs +28.2% 🔴
chain — 5 ops (grep eval grep eval
implicit — 2 ops (grep eval), 1K records 191.3µs 113.8µs
chain — 2 ops (grep eval), 10K records 629.1µs 469.1µs
implicit — 3 ops (grep eval grep), 100 records 144.9µs
implicit — 3 ops (grep eval grep), 1K records 212.2µs
implicit — 5 ops (grep eval grep eval
TextDecoderStream — 10K lines 6.06ms 3.84ms +57.7% 🔴

103 benchmarks: 16 faster, 19 slower, 68 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.1µs 151.4µs -0.3% 661.96K rec/s
Record.fromJSON — 10K lines 13.69ms 12.78ms +7.1% 730.25K rec/s, 216.3 MB/s
InputStream.fromString — 100 records 369.3µs 207.8µs +77.7% 🔴 270.78K rec/s
InputStream.fromString — 10K records 18.99ms 17.98ms +5.6% 526.58K rec/s, 155.9 MB/s
JSON.parse baseline — 10K lines (no Record) 12.86ms 12.57ms +2.3% 777.60K rec/s, 230.3 MB/s
JSON.parse single array — 10K records 13.45ms 12.77ms +5.4% 743.38K rec/s, 220.2 MB/s

JSON Serialization

Benchmark Median Baseline Delta Throughput
Record.toString — 100 records 82.3µs 84.6µs -2.7% 1.22M rec/s
Record.toString — 10K records 8.59ms 6.92ms +24.1% 🔴 1.16M rec/s, 344.8 MB/s
Record.toJSON — 10K records 288.4µs 308.0µs -6.4% 34.68M rec/s
JSON.stringify baseline — 10K objects (no Record) 6.75ms 7.86ms -14.1% 🟢 1.48M rec/s, 438.5 MB/s
Batch join — 10K records (map+join) 8.61ms 8.49ms +1.4% 1.16M rec/s, 344.0 MB/s

KeySpec Access

Benchmark Median Baseline Delta Throughput
KeySpec — simple key (name) 407.3µs 402.2µs +1.3% 24.55M rec/s
KeySpec — nested key (address/zip) 612.5µs 542.7µs +12.9% 🔴 16.33M rec/s
KeySpec — deep nested (address/coords/lat) 1.14ms 562.4µs +101.9% 🔴 8.81M rec/s
KeySpec — array index (tags/#0) 563.1µs 528.1µs +6.6% 17.76M rec/s
Direct property access baseline (rec['name']) 81.1µs 42.0µs +92.9% 🔴 123.33M rec/s
Direct nested access baseline (rec.address.coords.lat) 82.8µs 77.1µs +7.4% 120.76M rec/s
KeySpec construction — cached (same spec 10K times) 278.5µs 285.8µs -2.5% 35.90M rec/s
KeySpec construction — unique specs (10K different) 2.67ms 2.27ms +17.4% 🔴 3.75M rec/s
Compiled KeySpec.resolveValue — nested (address/zip) 159.8µs 303.7µs -47.4% 🟢 62.56M rec/s
Compiled KeySpec.resolveValue — deep (address/coords/lat) 236.0µs 226.9µs +4.0% 42.37M rec/s
Compiled KeySpec.resolveValue — array (tags/#0) 154.9µs 287.2µs -46.1% 🟢 64.55M rec/s
Compiled KeySpec.setValue — nested (address/zip) 130.8µs 155.5µs -15.9% 🟢 76.44M rec/s

Core Operations

Benchmark Median Baseline Delta Throughput
grep — 10K records (r.age > 50) 374.3µs 432.2µs -13.4% 🟢 26.72M rec/s
grep — 10K records (string match) 364.6µs 359.7µs +1.4% 27.43M rec/s
eval — 10K records (add computed field) 1.38ms 1.32ms +5.0% 7.23M rec/s
xform — 10K records (push each record) 1.07ms 1.06ms +1.2% 9.34M rec/s
sort — 100 records (by score, numeric) 185.6µs 160.8µs +15.4% 🔴 538.82K rec/s
sort — 10K records (by score, numeric) 17.76ms 17.99ms -1.3% 563.07K rec/s
sort — 10K records (by name, lexical) 12.04ms 13.42ms -10.3% 🟢 830.69K rec/s
collate — 100 records (count by city) 456.3µs 356.1µs +28.2% 🔴 219.13K rec/s
collate — 10K records (count by city) 12.66ms 11.76ms +7.7% 789.92K rec/s
fromcsv — 10K rows (parse CSV to records) 14.64ms 16.25ms -9.9% 683.21K rec/s, 44.9 MB/s

Pipeline Overhead

Benchmark Median Baseline Delta Throughput
chain — single op (grep), 10K records 7.11ms 7.42ms -4.1% 1.41M rec/s
chain — 3 ops (grep eval grep), 10K records 7.67ms 8.37ms
chain — 5 ops (grep eval grep eval grep), 10K records
passthrough baseline — 10K records (direct collector) 6.18ms 6.29ms -1.8% 1.62M rec/s

Record Creation & Serialization

Benchmark Median Baseline Delta Throughput
new Record() — 10K objects 71.2µs 70.8µs +0.6% 140.43M rec/s
new Record() empty — 10K 101.4µs 95.0µs +6.7% 98.62M rec/s
Record.get — 10K records × 3 fields 93.5µs 100.3µs -6.8% 321.00M rec/s
Record.set — 10K records × 1 field 126.1µs 122.6µs +2.8% 79.33M rec/s
Record.toJSON — 10K records 287.4µs 308.0µs -6.7% 34.79M rec/s
Record.toString — 10K records 6.86ms 6.92ms -0.9% 1.46M rec/s
Record.clone — 10K records 6.14ms 6.69ms -8.1% 1.63M rec/s
Record.fromJSON — 10K lines 12.84ms 12.78ms +0.5% 778.52K rec/s, 230.6 MB/s
Record.dataRef — 10K records (zero-copy) 37.6µs 37.8µs -0.5% 266.10M rec/s
Record.sort — 10K records (numeric field) 11.06ms 11.97ms -7.7% 904.46K rec/s
Record.sort — 10K records (lexical field) 5.73ms 5.91ms -3.0% 1.75M rec/s
Record.cmp — 1M comparisons (single field) 108.36ms 122.61ms -11.6% 🟢 9.23M rec/s
Record.sort — 10K records (nested field numeric) 15.35ms 16.04ms -4.3% 651.28K rec/s
Record.cmp — 1M comparisons (multi-field cached) 91.82ms 85.19ms +7.8% 10.89M rec/s
Record.sort — 10K records (cached comparator reuse) 11.56ms 11.68ms -1.0% 865.33K rec/s

Chain vs Pipe

Benchmark Median Baseline Delta Throughput
chain — 2 ops (grep eval), 100 records 61.5µs 129.7µs -52.6% 🟢
pipe — 2 ops (grep eval), 100 records 513.24ms 507.45ms +1.1%
implicit — 2 ops (grep eval), 100 records 86.9µs 124.2µs -30.0% 🟢
chain — 2 ops (grep eval), 1K records 102.5µs 122.2µs -16.1% 🟢
pipe — 2 ops (grep eval), 1K records 510.22ms 501.81ms +1.7%
implicit — 2 ops (grep eval), 1K records 191.3µs 113.8µs +68.0% 🔴
chain — 2 ops (grep eval), 10K records 629.1µs 469.1µs +34.1% 🔴
pipe — 2 ops (grep eval), 10K records 512.35ms 508.68ms +0.7%
implicit — 2 ops (grep eval), 10K records 474.2µs 669.3µs -29.2% 🟢
chain — 3 ops (grep eval grep), 100 records 73.7µs 170.1µs
pipe — 3 ops (grep eval grep), 100 records 763.98ms 749.36ms
implicit — 3 ops (grep eval grep), 100 records 144.9µs 92.3µs
chain — 3 ops (grep eval grep), 1K records 195.9µs 207.1µs
pipe — 3 ops (grep eval grep), 1K records 771.65ms 753.55ms
implicit — 3 ops (grep eval grep), 1K records 212.2µs 134.7µs
chain — 3 ops (grep eval grep), 10K records 410.9µs 472.1µs
pipe — 3 ops (grep eval grep), 10K records 771.10ms 752.54ms
implicit — 3 ops (grep eval grep), 10K records 432.1µs 475.7µs
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 478.5µs 480.3µs -0.4% 208.99K rec/s, 61.7 MB/s
InputStream.fromString — 100 lines 197.9µs 187.8µs +5.4% 505.32K rec/s, 149.3 MB/s
manual buffer (isolated) — 100 lines 283.8µs 236.5µs +20.0% 🔴 352.35K rec/s, 104.1 MB/s
bulk text + split — 100 lines 99.9µs 93.7µs +6.6% 1.00M rec/s, 295.7 MB/s
node readline — 100 lines 466.8µs 455.1µs +2.6% 214.22K rec/s, 63.3 MB/s
TextDecoderStream — 100 lines 255.6µs 261.4µs -2.2% 391.22K rec/s, 115.6 MB/s
binary newline scan — 100 lines 270.6µs 262.5µs +3.1% 369.50K rec/s, 109.1 MB/s
bun native stdin — 100 lines 25.68ms 24.47ms +4.9% 3.89K rec/s, 1.2 MB/s
InputStream.fromFile — 10K lines 23.75ms 23.46ms +1.2% 421.07K rec/s, 124.7 MB/s
InputStream.fromString — 10K lines 18.10ms 17.44ms +3.8% 552.49K rec/s, 163.6 MB/s
manual buffer (isolated) — 10K lines 6.30ms 6.36ms -1.0% 1.59M rec/s, 470.1 MB/s
bulk text + split — 10K lines 2.52ms 2.25ms +11.9% 🔴 3.97M rec/s, 1177.1 MB/s
node readline — 10K lines 9.36ms 8.98ms +4.2% 1.07M rec/s, 316.5 MB/s
TextDecoderStream — 10K lines 6.06ms 3.84ms +57.7% 🔴 1.65M rec/s, 488.9 MB/s
binary newline scan — 10K lines 7.85ms 7.55ms +3.9% 1.27M rec/s, 377.3 MB/s
bun native stdin — 10K lines 42.24ms 43.16ms -2.1% 236.75K rec/s, 70.1 MB/s
InputStream.fromFile — 100K lines 259.18ms 257.15ms +0.8% 385.84K rec/s, 114.7 MB/s
InputStream.fromString — 100K lines 206.74ms 207.41ms -0.3% 483.70K rec/s, 143.7 MB/s
manual buffer (isolated) — 100K lines 38.13ms 35.91ms +6.2% 2.62M rec/s, 779.4 MB/s
bulk text + split — 100K lines 29.95ms 26.03ms +15.1% 🔴 3.34M rec/s, 992.1 MB/s
node readline — 100K lines 88.76ms 82.91ms +7.1% 1.13M rec/s, 334.8 MB/s
TextDecoderStream — 100K lines 44.92ms 38.41ms +17.0% 🔴 2.23M rec/s, 661.5 MB/s
binary newline scan — 100K lines 75.63ms 75.44ms +0.2% 1.32M rec/s, 392.9 MB/s
bun native stdin — 100K lines 126.48ms 119.95ms +5.4% 790.65K rec/s, 234.9 MB/s

@benbernard benbernard merged commit 20c48f0 into master Feb 25, 2026
4 checks passed
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