Skip to content

Conversation

@cb1kenobi
Copy link
Contributor

Use actions/setup-node package caching and update actions.

Fixes #194

@cb1kenobi cb1kenobi requested a review from a team November 11, 2025 00:38
@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 24.88K ops/sec 40.20 35.85 467.636 1.06 12,438
🥈 rocksdb 2 4.71K ops/sec 212.176 199.481 1,675.284 0.964 2,357

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 27.27K ops/sec 36.67 33.06 541.845 0.904 13,637
🥈 rocksdb 2 5.16K ops/sec 193.824 181.575 863.059 0.538 2,580

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 24.50K ops/sec 40.82 36.44 673.772 1.00 12,249
🥈 rocksdb 2 5.06K ops/sec 197.659 187.305 777.036 0.409 2,530

Value encoding > msgpack values - strings (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 16.14K ops/sec 61.94 54.54 471.405 1.20 8,072
🥈 rocksdb 2 4.50K ops/sec 222.082 208.587 790.45 0.507 2,252

Value encoding > msgpack values - numbers (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 27.90K ops/sec 35.84 34.62 389.027 0.442 13,952
🥈 rocksdb 2 4.94K ops/sec 202.336 185.986 4,147.884 1.63 2,472

Value encoding > msgpack values - arrays (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 9.10K ops/sec 109.838 95.54 740.155 1.49 4,553
🥈 rocksdb 2 3.63K ops/sec 275.593 259.93 1,170.863 0.592 1,815

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 5.72K ops/sec 174.87 155.509 1,098.7 1.91 2,860
🥈 rocksdb 2 2.73K ops/sec 365.744 344.481 943.067 0.628 1,368

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 639.51 ops/sec 1,563.706 1,449.945 6,871.605 3.38 320
🥈 rocksdb 2 634.92 ops/sec 1,575.003 1,443.744 3,515.316 2.07 318

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 20.73K ops/sec 48.24 41.45 3,599.794 1.82 10,366
🥈 rocksdb 2 4.49K ops/sec 222.768 194.04 10,878.161 6.29 2,245

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 4.15K ops/sec 240.709 227.26 791.677 0.490 2,078
🥈 random 2 4.05K ops/sec 246.681 231.12 1,165.264 0.795 2,027

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 3.20K ops/sec 312.706 283.486 2,321.413 2.18 1,599

get() > rocksdb - async vs sync

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 sync 1 4.27K ops/sec 234.358 210.91 3,682.509 1.98 2,134
🥈 async 2 3.74K ops/sec 267.288 252.167 1,048.123 0.532 1,871

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.24K ops/sec 446.527 430.067 566.344 0.172 1,120
🥈 lmdb 2 4.16 ops/sec 240,587.048 231,781.212 255,278.771 2.88 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.14K ops/sec 467.984 418.993 670.248 0.376 1,069
🥈 lmdb 2 4.22 ops/sec 237,243.553 219,474.691 255,820.042 3.15 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 981.91 ops/sec 1,018.427 889.29 15,545.712 5.72 491
🥈 lmdb 2 3.91 ops/sec 255,510.938 246,162.667 276,069.51 3.06 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.03K ops/sec 975.481 899.366 1,368.695 0.468 513
🥈 lmdb 2 3.90 ops/sec 256,340.357 246,815.067 273,443.139 2.91 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.30K ops/sec 434.768 396.204 637.747 0.199 1,151
🥈 lmdb 2 4.11 ops/sec 243,086.258 232,154.987 265,848.156 3.21 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 50.88 ops/sec 19,652.965 17,691.237 21,249.465 2.57 26.00
🥈 lmdb 2 2.66 ops/sec 375,981.335 365,753.933 392,279.46 1.66 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 5.19 ops/sec 192,736.718 183,064.25 204,824.842 2.78 10.00
🥈 lmdb 2 1.76 ops/sec 567,906.206 526,604.178 610,171.554 3.60 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 0.28 ops/sec 3,620,789.062 2,898,990.882 4,002,554.35 7.90 10.00
🥈 rocksdb 2 0.28 ops/sec 3,621,989.183 2,430,762.425 4,383,002.201 12.24 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.96K ops/sec 511.293 477.848 861.324 0.403 978
🥈 lmdb 2 3.81 ops/sec 262,376.542 251,996.727 270,382.236 1.40 10.00

put > async vs sync overhead

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 sync 1 1.99K ops/sec 501.938 475.644 629.806 0.150 997
🥈 async 2 1.88K ops/sec 532.513 494.401 1,099.533 0.352 939

ranges.bench.ts

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 22.29K ops/sec 44.86 37.99 1,104.775 1.18 11,146
🥈 rocksdb 2 2.91K ops/sec 343.305 294.633 2,339.936 2.88 1,457

getRange() > full scan vs range scan

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb range scan 1 19.32K ops/sec 51.77 43.11 1,387.103 1.26 9,659
🥈 lmdb full scan 2 10.83K ops/sec 92.36 76.91 1,376.761 1.65 5,414
🥉 rocksdb range scan 3 2.94K ops/sec 340.157 298.174 2,462.724 2.40 1,470
rocksdb full scan 4 1.59K ops/sec 628.667 554.508 3,759.128 3.09 796

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 49.00K ops/sec 20.41 16.82 9,549.317 4.13 24,500
🥈 rocksdb 2 4.73K ops/sec 211.558 188.419 1,178.801 1.22 2,364

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 520.14K ops/sec 1.92 1.21 5,982.579 6.95 260,068
🥈 rocksdb 2 2.80K ops/sec 357.094 322.65 1,631.518 1.62 1,401

Reverse iteration > rocksdb - reverse vs forward

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 forward 1 6.60K ops/sec 151.534 135.876 949.084 1.24 3,300
🥈 reverse 2 2.88K ops/sec 347.166 313.678 1,558.858 1.70 1,441

Range query patterns > prefix scan performance

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 30.53K ops/sec 32.76 28.67 1,135.834 1.22 15,264
🥈 rocksdb 2 3.34K ops/sec 299.118 270.019 2,358.516 2.09 1,672

Sparse data patterns > sparse - range over gaps

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 58.73K ops/sec 17.03 14.75 1,945.002 1.52 29,367
🥈 rocksdb 2 6.00K ops/sec 166.682 146.638 1,648.989 1.33 3,000

Sparse data patterns > sparse - prefix with gaps

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 126.19K ops/sec 7.92 6.87 2,786.852 2.55 63,098
🥈 rocksdb 2 12.25K ops/sec 81.63 71.98 2,868.85 1.37 6,126

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.00K ops/sec 76.93 70.32 843.744 0.868 6,500
🥈 rocksdb 2 2.59K ops/sec 385.744 372.237 541.303 0.173 1,297

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 12.82K ops/sec 77.99 73.42 760.704 0.733 6,412
🥈 rocksdb 2 2.66K ops/sec 375.246 340.567 546.314 0.184 1,333

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 sequential 1 2.69K ops/sec 371.641 342.106 507.381 0.277 1,346
🥈 random 2 2.69K ops/sec 371.654 353.924 538.458 0.218 1,346

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 8.43K ops/sec 118.654 96.35 1,688.71 1.64 4,214
🥈 rocksdb 2 1.05K ops/sec 949.95 813.138 3,709.715 1.34 527

removeSync() > random access pattern (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 10.46K ops/sec 95.62 81.54 643.762 1.39 5,229
🥈 rocksdb 2 2.66K ops/sec 375.668 350.674 509.434 0.149 1,331

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 11.62K ops/sec 86.03 81.58 364.617 0.291 5,812
🥈 rocksdb 2 2.60K ops/sec 383.91 351.166 480.002 0.132 1,303

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 582.26 ops/sec 1,717.46 1,607.734 4,872.423 1.70 292
🥈 lmdb 2 4.20 ops/sec 237,910.594 233,579.429 254,750.448 1.84 10.00

transaction sync > optimistic > batch operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.87K ops/sec 348.264 308.449 2,463.296 1.15 1,436
🥈 lmdb 2 330.66 ops/sec 3,024.26 1,907.847 7,308.199 3.98 166

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 353.86 ops/sec 2,825.965 2,573.03 5,053.717 1.87 178
🥈 lmdb 2 4.18 ops/sec 239,239.116 232,733.691 258,562.496 2.17 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 569.74 ops/sec 1,755.186 1,685.391 3,510.911 1.19 285
🥈 lmdb 2 4.20 ops/sec 238,296.385 216,782.023 254,364.556 3.66 10.00

transaction sync > optimistic > rollback operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 15.40K ops/sec 64.96 61.83 344.078 0.358 7,698
🥈 rocksdb 2 5.49K ops/sec 182.306 175.656 856.274 0.300 2,743

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.90K ops/sec 344.841 300.641 522.509 0.243 1,450
🥈 rocksdb 2 599.30 ops/sec 1,668.605 1,612.229 4,591.57 1.17 300

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 364.64 ops/sec 2,742.455 2,325.176 5,959.963 1.87 183
🥈 lmdb 2 4.19 ops/sec 238,615.118 228,752.376 259,242.168 3.15 10.00

transaction sync > optimistic > empty transaction overhead

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 743.67K ops/sec 1.34 1.13 3,462.58 1.43 371,837
🥈 rocksdb 2 93.37K ops/sec 10.71 9.25 1,308.894 0.846 46,688

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 1.51K ops/sec 661.944 598.044 4,368.094 3.36 756
🥈 rocksdb 2 271.10 ops/sec 3,688.657 3,436.419 9,331.062 3.18 136

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 527.04 ops/sec 1,897.382 1,832.868 5,964.41 1.62 264
🥈 lmdb 2 4.16 ops/sec 240,376.956 229,797.461 261,800.524 3.35 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 336.54 ops/sec 2,971.409 2,658.246 5,877.977 2.86 169
🥈 lmdb 2 3.57 ops/sec 279,803.85 249,479.44 307,035.466 4.46 10.00

transaction > optimistic > batch operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.27K ops/sec 440.533 349.399 611.638 0.402 1,135
🥈 lmdb 2 293.98 ops/sec 3,401.601 3,168.485 6,674.845 1.86 147

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 212.20 ops/sec 4,712.59 3,974.308 11,935.856 4.30 107
🥈 lmdb 2 3.41 ops/sec 293,357.242 277,732.523 334,006.334 4.09 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 962.28 ops/sec 1,039.204 916.468 3,664.703 3.20 482
🥈 lmdb 2 275.04 ops/sec 3,635.863 2,133.712 6,792.676 2.75 138

transaction > optimistic > rollback operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 4.91K ops/sec 203.612 185.229 753.485 0.484 2,456
🥈 lmdb 2 269.39 ops/sec 3,712.042 3,196.841 6,445.908 4.38 135

transaction > optimistic > rocksdb - large transaction vs many small

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.25K ops/sec 443.8 380.748 766.046 0.242 1,127
🥈 rocksdb 2 312.36 ops/sec 3,201.404 2,787.968 7,695.909 3.90 157

transaction > optimistic > lmdb - large transaction vs many small

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 305.19 ops/sec 3,276.595 2,212.892 12,286.524 4.14 153
🥈 lmdb 2 3.60 ops/sec 277,729.168 243,917.718 301,343.585 4.02 10.00

transaction > optimistic > empty transaction overhead

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 43.15K ops/sec 23.17 18.19 482.814 0.406 21,576
🥈 rocksdb 2 40.81K ops/sec 24.51 19.77 4,526.595 3.20 20,404

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 346.54 ops/sec 2,885.646 2,628.702 19,448.29 7.22 174
🥈 rocksdb 2 177.14 ops/sec 5,645.192 4,900.119 12,892.695 4.75 89.00

transaction > pessimistic > simple put operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 185.44 ops/sec 5,392.585 4,097.074 17,457.789 13.70 93.00
🥈 lmdb 2 3.62 ops/sec 275,963.399 261,800.044 307,475.674 3.14 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 14.44K ops/sec 69.25 57.55 6,866.759 3.28 7,220
🥈 rocksdb 2 3.78K ops/sec 264.316 220.358 1,669.438 1.09 1,892

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 14.32K ops/sec 69.82 61.81 6,926.116 3.16 7,161
🥈 rocksdb 2 3.65K ops/sec 273.634 229.863 1,370.817 0.930 1,829

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.35K ops/sec 135.972 120.774 2,275.628 1.03 3,678
🥈 rocksdb 2 1.73K ops/sec 577.466 487.65 2,620.466 1.90 866

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.77K ops/sec 565.82 499.8 3,363.646 1.30 884
🥈 lmdb 2 4.11 ops/sec 243,472.807 231,093.303 288,040.15 5.12 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.42K ops/sec 705.916 666.503 2,518.493 0.741 709
🥈 lmdb 2 2.17 ops/sec 461,670.739 441,242.971 482,612.061 1.63 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 788.37 ops/sec 1,268.445 1,114.517 5,058.734 1.96 395
🥈 lmdb 2 1.08 ops/sec 925,417.71 808,080.185 1,085,407.797 9.07 10.00

Results from commit 97d809e

@cb1kenobi cb1kenobi merged commit 76464b8 into main Nov 11, 2025
39 of 41 checks passed
@cb1kenobi cb1kenobi deleted the update-ci-actions branch November 11, 2025 23:03
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.

Replace actions/cache with actions/node-setup cache for pnpm

3 participants