Skip to content

Conversation

@cb1kenobi
Copy link
Contributor

tsdown uses rolldown to bundle TypeScript projects. tsdown uses the OXC compiler which has around 22% improved minification over esbuild and sped up the bundle time by 18.5 times.

Before:

pnpm build:bundle  7.66s user 0.39s system 195% cpu 4.122 total

-rw-r--r--@  1 chris  staff  18454 Oct 14 17:24 index.cjs
-rw-r--r--@  1 chris  staff  38279 Oct 14 17:24 index.cjs.map
-rw-r--r--@  1 chris  staff  11553 Oct 14 17:24 index.d.ts
-rw-r--r--@  1 chris  staff  17974 Oct 14 17:24 index.js
-rw-r--r--@  1 chris  staff  38063 Oct 14 17:24 index.js.map

After:

pnpm build:bundle  0.47s user 0.15s system 64% cpu 0.959 total

-rw-r--r--@  1 chris  staff  13779 Oct 14 17:24 index.cjs
-rw-r--r--@  1 chris  staff  29392 Oct 14 17:24 index.d.cts
-rw-r--r--@  1 chris  staff  29392 Oct 14 17:24 index.d.ts
-rw-r--r--@  1 chris  staff  13040 Oct 14 17:24 index.js

@cb1kenobi cb1kenobi requested a review from a team October 15, 2025 19:52
@github-actions
Copy link

📊 Benchmark Results

encoding.bench.ts

Key encoding > ordered-binary keys - strings (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 25.10K ops/sec 39.84 37.29 374.507 0.366 12,551
🥈 rocksdb 2 4.68K ops/sec 213.515 197.943 1,835.94 1.20 2,342

Key encoding > ordered-binary keys - numbers (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 27.79K ops/sec 35.98 34.09 384.124 0.303 13,896
🥈 rocksdb 2 4.68K ops/sec 213.52 203.135 968.757 0.494 2,342

Key encoding > ordered-binary keys - mixed types (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 24.96K ops/sec 40.07 38.06 371.38 0.328 12,480
🥈 rocksdb 2 4.69K ops/sec 213.252 202.198 527.736 0.324 2,345

Value encoding > msgpack values - strings (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 15.98K ops/sec 62.56 60.64 367.706 0.286 7,992
🥈 rocksdb 2 4.22K ops/sec 237.068 223.553 780.247 0.423 2,110

Value encoding > msgpack values - numbers (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 25.73K ops/sec 38.87 36.59 422.018 0.349 12,864
🥈 rocksdb 2 4.84K ops/sec 206.736 192.958 862.488 0.467 2,419

Value encoding > msgpack values - arrays (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 9.57K ops/sec 104.462 98.73 606.607 0.448 4,787
🥈 rocksdb 2 3.55K ops/sec 281.792 265.577 921.055 0.538 1,775

Value encoding > msgpack values - small objects (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 5.88K ops/sec 169.954 161.373 616.643 0.429 2,942
🥈 rocksdb 2 2.62K ops/sec 382.012 355.671 924.04 0.662 1,309

Value encoding > msgpack values - large objects (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 651.76 ops/sec 1,534.312 1,469.43 2,953.752 0.909 326
🥈 rocksdb 2 616.75 ops/sec 1,621.407 1,477.314 3,205.718 1.99 309

get-sync.bench.ts

getSync() > random keys - small key size (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 21.07K ops/sec 47.47 44.24 3,197.174 1.28 10,533
🥈 rocksdb 2 4.36K ops/sec 229.385 199.981 11,671.006 6.26 2,180

get.bench.ts

get() > rocksdb - random vs sequential keys (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 sequential 1 3.91K ops/sec 255.772 240.245 925.582 0.557 1,955
🥈 random 2 3.84K ops/sec 260.266 243.843 1,250.771 0.701 1,922

get() > random keys - max 1978 lmdb key size (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.95K ops/sec 339.369 305.309 2,491.283 2.17 1,474

get() > rocksdb - async vs sync

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 sync 1 4.37K ops/sec 228.576 211.644 2,627.482 1.31 2,188
🥈 async 2 3.47K ops/sec 288.126 271.08 946.009 0.442 1,736

put-sync.bench.ts

putSync() > random keys - insert - small key size (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.16K ops/sec 463.725 435.527 582.351 0.215 1,079
🥈 lmdb 2 4.95 ops/sec 201,836.857 194,477.38 219,049.238 3.13 10.00

putSync() > random keys - update - small key size (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.21K ops/sec 453.345 428.573 630.432 0.245 1,103
🥈 lmdb 2 5.09 ops/sec 196,535.685 190,011.145 202,690.104 1.44 10.00

putSync() > random keys - insert - max 1978 lmdb key size (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 987.01 ops/sec 1,013.164 901.364 1,230.972 0.441 494
🥈 lmdb 2 4.82 ops/sec 207,389.45 197,057.871 224,849.037 3.49 10.00

putSync() > random keys - update - max 1978 lmdb key size (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 1.00K ops/sec 997.741 903.22 1,177.526 0.471 502
🥈 lmdb 2 4.85 ops/sec 206,312.445 195,322.392 224,509.588 4.07 10.00

putSync() > sequential keys - insert (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.25K ops/sec 443.52 420.205 539.311 0.108 1,128
🥈 lmdb 2 5.02 ops/sec 199,206.843 186,047.53 219,320.408 4.41 10.00

putSync() > put 100KB value (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 50.77 ops/sec 19,696.633 18,127.252 21,133.182 2.37 26.00
🥈 lmdb 2 4.26 ops/sec 234,512.982 227,401.14 243,967.818 1.81 10.00

putSync() > put 1MB value (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 5.24 ops/sec 190,829.134 183,779.119 206,342.081 2.40 10.00
🥈 lmdb 2 2.62 ops/sec 382,300.475 369,663.644 403,488.957 1.70 10.00

putSync() > get 10MB value (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 0.39 ops/sec 2,558,782.869 2,221,545.495 2,921,545.22 6.49 10.00
🥈 lmdb 2 0.32 ops/sec 3,120,989.3 3,054,026.572 3,325,659.565 2.14 10.00

put.bench.ts

put > small dataset (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 1.94K ops/sec 515.787 483.972 833.164 0.377 970
🥈 lmdb 2 4.70 ops/sec 212,946.384 207,802.693 217,980.786 0.980 10.00

put > async vs sync overhead

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 sync 1 2.16K ops/sec 462.158 432.498 898.072 0.257 1,082
🥈 async 2 1.96K ops/sec 511.11 464.957 971.097 0.358 979

ranges.bench.ts

getRange() > small range (100 records, 50 range)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 24.43K ops/sec 40.94 38.56 451.973 0.510 12,214
🥈 rocksdb 2 2.81K ops/sec 356.207 303.469 2,174.79 2.66 1,404

getRange() > full scan vs range scan

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb range scan 1 22.44K ops/sec 44.56 40.67 615.578 0.652 11,222
🥈 lmdb full scan 2 12.33K ops/sec 81.09 77.19 524.621 0.618 6,167
🥉 rocksdb range scan 3 2.93K ops/sec 341.092 301.591 2,257.432 2.12 1,466
rocksdb full scan 4 1.56K ops/sec 642.709 569.439 3,752.035 3.13 778

getKeys() > keys only (100 records, 50 range)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 53.53K ops/sec 18.68 16.65 2,763.306 1.59 26,764
🥈 rocksdb 2 4.78K ops/sec 209.145 186.721 1,161.49 1.23 2,391

Reverse iteration > reverse range (100 records, 50 range)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 549.28K ops/sec 1.82 1.30 5,717.121 6.75 274,640
🥈 rocksdb 2 2.75K ops/sec 363.73 329.77 1,338.154 1.54 1,375

Reverse iteration > rocksdb - reverse vs forward

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 forward 1 3.00K ops/sec 333.866 303.95 1,559.112 1.69 1,498
🥈 reverse 2 2.82K ops/sec 354.289 322.455 1,580.899 1.62 1,412

Range query patterns > prefix scan performance

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 31.88K ops/sec 31.37 29.13 1,243.582 1.03 15,941
🥈 rocksdb 2 3.11K ops/sec 321.249 290.976 2,271.15 2.05 1,557

Sparse data patterns > sparse - range over gaps

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 60.90K ops/sec 16.42 15.08 1,763 1.47 30,449
🥈 rocksdb 2 5.77K ops/sec 173.224 158.238 1,286.556 1.21 2,887

Sparse data patterns > sparse - prefix with gaps

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 126.90K ops/sec 7.88 7.06 3,208.202 2.89 63,449
🥈 rocksdb 2 11.45K ops/sec 87.30 75.75 2,446.02 1.39 5,728

remove-sync.bench.ts

removeSync() > random keys - small key size (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 13.42K ops/sec 74.49 68.34 443.737 0.461 6,713
🥈 rocksdb 2 2.58K ops/sec 387.764 365.405 564.95 0.245 1,290

removeSync() > sequential keys - small key size (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 13.23K ops/sec 75.57 71.71 385.519 0.351 6,617
🥈 rocksdb 2 2.56K ops/sec 390.009 366.872 575.233 0.190 1,283

removeSync() > rocksdb - random vs sequential keys (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 sequential 1 2.56K ops/sec 390.742 361.96 550.197 0.183 1,280
🥈 random 2 2.53K ops/sec 395.731 377.57 553.386 0.186 1,264

removeSync() > random keys - max 1978 lmdb key size (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 3.83K ops/sec 261.337 251.523 654.924 0.305 1,914
🥈 rocksdb 2 1.03K ops/sec 972.661 881.202 1,184.011 0.439 515

removeSync() > random access pattern (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 12.27K ops/sec 81.47 75.28 466.446 0.343 6,138
🥈 rocksdb 2 2.52K ops/sec 397.042 365.764 590.365 0.232 1,260

removeSync() > non-existent keys (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 12.28K ops/sec 81.41 76.99 311.336 0.264 6,142
🥈 rocksdb 2 2.51K ops/sec 398.56 369.07 613.809 0.214 1,255

transaction-sync.bench.ts

transaction sync > optimistic > simple put operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 563.66 ops/sec 1,774.127 1,666.861 4,755.282 1.66 282
🥈 lmdb 2 5.10 ops/sec 196,000.596 190,344.724 213,051.353 2.35 10.00

transaction sync > optimistic > batch operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.85K ops/sec 351.332 304.695 2,057.66 0.952 1,424
🥈 lmdb 2 456.98 ops/sec 2,188.297 1,949.101 5,044.639 3.32 229

transaction sync > optimistic > read-write operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 344.30 ops/sec 2,904.423 2,626.988 5,231.104 1.90 173
🥈 lmdb 2 5.13 ops/sec 195,071.863 190,610.495 200,194.695 1.11 10.00

transaction sync > optimistic > concurrent non-conflicting operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 550.39 ops/sec 1,816.901 1,739.462 3,434.194 1.07 276
🥈 lmdb 2 5.08 ops/sec 196,850.907 192,107.945 218,939.158 2.97 10.00

transaction sync > optimistic > rollback operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 16.01K ops/sec 62.47 59.74 419.937 0.397 8,004
🥈 rocksdb 2 5.63K ops/sec 177.612 167.671 964.655 0.399 2,816

transaction sync > optimistic > rocksdb - large transaction vs many small

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.93K ops/sec 341.392 295.687 478.368 0.239 1,465
🥈 rocksdb 2 577.91 ops/sec 1,730.379 1,652.742 4,297.495 1.34 289

transaction sync > optimistic > lmdb - large transaction vs many small

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 452.25 ops/sec 2,211.158 1,912.142 5,041.339 3.14 227
🥈 lmdb 2 5.15 ops/sec 194,326.517 190,369.576 198,919.557 1.08 10.00

transaction sync > optimistic > empty transaction overhead

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 782.99K ops/sec 1.28 1.10 1,557.126 0.778 392,141
🥈 rocksdb 2 88.05K ops/sec 11.36 10.24 2,058.942 1.10 44,026

transaction sync > optimistic > transaction with only reads (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 1.56K ops/sec 642.427 602.093 1,098.189 0.370 779
🥈 rocksdb 2 263.84 ops/sec 3,790.135 3,544.392 9,320.787 2.98 132

transaction sync > pessimistic > simple put operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 515.68 ops/sec 1,939.181 1,889.905 2,440.398 0.361 258
🥈 lmdb 2 5.01 ops/sec 199,434.405 189,174.24 237,228.014 5.77 10.00

transaction.bench.ts

transaction > optimistic > simple put operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 283.78 ops/sec 3,523.815 3,094.216 5,814.4 2.10 142
🥈 lmdb 2 4.69 ops/sec 213,357.962 201,764.812 234,587.635 3.37 10.00

transaction > optimistic > batch operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.22K ops/sec 449.623 377.698 1,076.423 0.398 1,113
🥈 lmdb 2 264.66 ops/sec 3,778.429 2,043.005 48,883.229 32.40 140

transaction > optimistic > read-write operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 153.22 ops/sec 6,526.739 4,593.509 8,014.4 1.78 77.00
🥈 lmdb 2 4.64 ops/sec 215,384.274 206,927.785 234,713.766 3.35 10.00

transaction > optimistic > concurrent non-conflicting operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 932.73 ops/sec 1,072.118 961.525 3,748.599 3.24 467
🥈 lmdb 2 407.99 ops/sec 2,451.065 2,045.08 5,488.861 3.55 204

transaction > optimistic > rollback operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 4.86K ops/sec 205.662 191.54 735.54 0.484 2,432
🥈 lmdb 2 441.55 ops/sec 2,264.729 2,045.086 5,246.185 1.86 221

transaction > optimistic > rocksdb - large transaction vs many small

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.26K ops/sec 441.511 342.379 779.254 0.345 1,133
🥈 rocksdb 2 255.11 ops/sec 3,919.945 2,889.712 7,864.62 3.05 128

transaction > optimistic > lmdb - large transaction vs many small

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 413.07 ops/sec 2,420.909 1,979.795 5,359.803 3.82 207
🥈 lmdb 2 4.62 ops/sec 216,625.813 202,111.158 237,458.536 3.50 10.00

transaction > optimistic > empty transaction overhead

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 44.60K ops/sec 22.42 18.02 427.455 0.329 22,302
🥈 rocksdb 2 37.25K ops/sec 26.84 20.84 3,999.111 2.91 18,627

transaction > optimistic > transaction with only reads (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 346.63 ops/sec 2,884.911 2,680.357 3,943.618 0.698 174
🥈 rocksdb 2 147.28 ops/sec 6,789.832 4,773.532 14,771.788 5.61 74.00

transaction > pessimistic > simple put operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 297.26 ops/sec 3,364.017 3,048.52 9,883.488 2.83 149
🥈 lmdb 2 4.61 ops/sec 216,746.689 203,970.012 232,847.416 3.58 10.00

worker-get-sync.bench.ts

Worker > random keys - small key size (100 records, 1 worker)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 15.43K ops/sec 64.79 59.72 1,221.61 0.602 7,717
🥈 rocksdb 2 3.78K ops/sec 264.618 222.456 1,314.214 0.917 1,890

Worker > random keys - small key size (100 records, 2 workers)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 13.47K ops/sec 74.25 63.87 1,275.257 0.758 6,735
🥈 rocksdb 2 3.55K ops/sec 281.994 234.626 1,293.961 0.975 1,774

Worker > random keys - small key size (100 records, 10 workers)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 7.48K ops/sec 133.62 119.149 2,046.178 0.899 3,742
🥈 rocksdb 2 1.70K ops/sec 586.995 495.411 3,670.838 2.19 852

worker-put-sync.bench.ts

putSync() > random keys - small key size (100 records, 1 worker)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 1.82K ops/sec 549.874 486.137 2,170.877 0.832 910
🥈 lmdb 2 4.72 ops/sec 211,783.593 197,646.244 244,728.678 5.28 10.00

putSync() > random keys - small key size (100 records, 2 workers)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 1.38K ops/sec 724.395 671.279 2,266.452 0.669 691
🥈 lmdb 2 2.45 ops/sec 408,435.778 396,344.132 426,053.811 1.71 10.00

putSync() > random keys - small key size (100 records, 10 workers)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 807.36 ops/sec 1,238.606 1,093.35 6,575.399 2.62 404
🥈 lmdb 2 0.61 ops/sec 1,635,979.183 1,359,748.189 1,756,987.605 4.77 10.00

Results from commit 9820493

@cb1kenobi cb1kenobi merged commit 9b977e7 into main Oct 16, 2025
21 checks passed
@cb1kenobi cb1kenobi deleted the tsdown branch October 16, 2025 15:09
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.

2 participants