Skip to content

Add license#177

Merged
cb1kenobi merged 2 commits intomainfrom
license
Oct 14, 2025
Merged

Add license#177
cb1kenobi merged 2 commits intomainfrom
license

Conversation

@cb1kenobi
Copy link
Copy Markdown
Contributor

@cb1kenobi cb1kenobi commented Oct 10, 2025

Add the Apache 2 license file and license property in the package.json.

@github-actions
Copy link
Copy Markdown
Contributor

📊 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.76K ops/sec 40.40 35.75 551.005 1.11 12,378
🥈 rocksdb 2 4.65K ops/sec 215.08 200.047 1,933.709 1.08 2,325

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 27.17K ops/sec 36.81 32.85 617.741 0.962 13,585
🥈 rocksdb 2 4.63K ops/sec 215.979 202.976 798.523 0.415 2,316

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 24.65K ops/sec 40.57 36.02 409.255 1.00 12,324
🥈 rocksdb 2 4.54K ops/sec 220.501 205.232 1,991.75 0.874 2,268

Value encoding > msgpack values - strings (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 16.17K ops/sec 61.84 55.66 496.889 1.18 8,086
🥈 rocksdb 2 4.10K ops/sec 243.973 228.976 1,064.043 0.486 2,050

Value encoding > msgpack values - numbers (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 27.05K ops/sec 36.97 35.41 363.642 0.444 13,526
🥈 rocksdb 2 4.61K ops/sec 216.87 198.948 2,709.488 1.19 2,306

Value encoding > msgpack values - arrays (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 9.18K ops/sec 108.967 97.27 738.034 1.52 4,589
🥈 rocksdb 2 3.49K ops/sec 286.497 269.937 948.097 0.606 1,746

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 5.84K ops/sec 171.188 153.326 1,131.254 1.75 2,921
🥈 rocksdb 2 2.66K ops/sec 375.804 352.732 1,086.16 0.716 1,331

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 640.73 ops/sec 1,560.724 1,426.272 6,858.06 3.56 321
🥈 rocksdb 2 635.41 ops/sec 1,573.788 1,433.619 3,400.806 1.95 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.14K ops/sec 49.65 42.37 3,115.653 1.72 10,070
🥈 rocksdb 2 4.38K ops/sec 228.061 200.068 11,516.546 6.25 2,193

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.88K ops/sec 258.018 243.324 1,076.676 0.576 1,938
🥈 random 2 3.49K ops/sec 286.481 269.919 1,268.146 0.787 1,746

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.98K ops/sec 335.185 304.559 2,519.359 2.50 1,492

get() > rocksdb - async vs sync

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 sync 1 4.12K ops/sec 242.986 224.633 2,795.674 1.17 2,058
🥈 async 2 3.56K ops/sec 280.593 262.988 1,199.459 0.532 1,782

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.17K ops/sec 460.427 435.785 635.366 0.223 1,087
🥈 lmdb 2 4.15 ops/sec 240,721.086 233,102.008 261,092.798 2.95 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.08K ops/sec 480.224 438.145 729.882 0.263 1,042
🥈 lmdb 2 4.14 ops/sec 241,750.439 231,032.402 261,166.912 3.43 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 948.79 ops/sec 1,053.978 903.904 13,694.076 4.98 475
🥈 lmdb 2 3.96 ops/sec 252,249.645 231,314.359 275,663.297 3.87 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 946.70 ops/sec 1,056.299 932.317 15,709.01 5.77 474
🥈 lmdb 2 3.93 ops/sec 254,657.502 248,568.063 287,127.025 3.24 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.13K ops/sec 468.399 438.392 2,822.249 0.956 1,068
🥈 lmdb 2 4.16 ops/sec 240,357.325 233,569.477 254,286.009 1.76 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 51.16 ops/sec 19,545.305 17,719.005 21,297.043 2.38 26.00
🥈 lmdb 2 2.65 ops/sec 377,003.957 368,050.261 398,937.151 2.12 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 4.91 ops/sec 203,474.365 185,924.31 235,843.571 5.99 10.00
🥈 lmdb 2 1.76 ops/sec 569,286.084 531,464.366 602,269.768 3.06 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 0.26 ops/sec 3,887,490.253 3,260,267.273 4,317,773.836 5.85 10.00
🥈 rocksdb 2 0.22 ops/sec 4,601,665.587 3,950,144.29 5,588,513.641 7.88 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.90K ops/sec 525.317 483.519 881.748 0.381 952
🥈 lmdb 2 3.75 ops/sec 266,887.628 257,424.217 285,384.792 2.67 10.00

put > async vs sync overhead

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 sync 1 2.10K ops/sec 475.8 445.628 543.521 0.139 1,051
🥈 async 2 1.92K ops/sec 521.504 487.438 800.056 0.327 959

ranges.bench.ts

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 21.84K ops/sec 45.78 39.77 684.994 1.12 10,921
🥈 rocksdb 2 2.79K ops/sec 357.795 304.583 2,329.244 2.84 1,401

getRange() > full scan vs range scan

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb range scan 1 21.83K ops/sec 45.81 39.71 681.412 1.17 10,916
🥈 lmdb full scan 2 11.40K ops/sec 87.69 77.65 868.377 1.47 5,703
🥉 rocksdb range scan 3 2.92K ops/sec 342.998 300.978 2,043.375 2.23 1,458
rocksdb full scan 4 1.57K ops/sec 637.537 562.079 3,338.631 2.98 785

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 50.18K ops/sec 19.93 16.46 3,526.527 2.05 25,089
🥈 rocksdb 2 4.64K ops/sec 215.311 190.985 873.805 1.02 2,323

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 488.63K ops/sec 2.05 1.33 7,686.106 7.54 244,317
🥈 rocksdb 2 2.80K ops/sec 357.599 321.856 1,278.509 1.45 1,399

Reverse iteration > rocksdb - reverse vs forward

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 forward 1 3.07K ops/sec 325.317 298.422 1,330.503 1.49 1,537
🥈 reverse 2 2.85K ops/sec 351.029 319.748 1,526.809 1.62 1,425

Range query patterns > prefix scan performance

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 30.22K ops/sec 33.09 28.85 1,225.345 1.21 15,110
🥈 rocksdb 2 3.25K ops/sec 308.05 278.34 4,032.728 2.55 1,624

Sparse data patterns > sparse - range over gaps

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 58.03K ops/sec 17.23 14.88 1,648.515 1.41 29,016
🥈 rocksdb 2 5.89K ops/sec 169.708 152.553 1,337.817 1.21 2,947

Sparse data patterns > sparse - prefix with gaps

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 121.08K ops/sec 8.26 6.97 2,715.35 2.51 60,542
🥈 rocksdb 2 11.81K ops/sec 84.70 73.74 2,179.67 1.30 5,903

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 12.71K ops/sec 78.70 69.46 813.852 1.62 6,354
🥈 rocksdb 2 2.53K ops/sec 394.636 373.799 520.678 0.261 1,267

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 12.42K ops/sec 80.52 68.51 724.855 1.36 6,210
🥈 rocksdb 2 2.59K ops/sec 386.726 369.182 555.713 0.192 1,293

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 random 1 2.60K ops/sec 384.786 363.163 543.87 0.251 1,300
🥈 sequential 2 2.60K ops/sec 384.844 369.039 554.047 0.175 1,300

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.15K ops/sec 122.722 91.83 1,605.201 2.76 4,075
🥈 rocksdb 2 1.07K ops/sec 938.939 802.394 1,545.708 0.802 533

removeSync() > random access pattern (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 11.80K ops/sec 84.72 72.90 705.373 1.34 5,902
🥈 rocksdb 2 2.55K ops/sec 392.706 368.492 528.282 0.233 1,274

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 12.36K ops/sec 80.88 74.12 390.858 0.323 6,182
🥈 rocksdb 2 2.47K ops/sec 404.381 377.491 605.323 0.157 1,237

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 548.90 ops/sec 1,821.827 1,713.83 4,587.436 1.55 275
🥈 lmdb 2 4.23 ops/sec 236,250.02 226,020.112 258,243.728 2.56 10.00

transaction sync > optimistic > batch operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.81K ops/sec 356.178 309.74 1,916.493 0.820 1,404
🥈 lmdb 2 362.22 ops/sec 2,760.753 1,904.356 5,404.922 2.03 182

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 334.95 ops/sec 2,985.551 2,672.67 4,812.004 1.68 168
🥈 lmdb 2 4.14 ops/sec 241,633.722 232,059.855 285,149.751 5.02 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 533.66 ops/sec 1,873.835 1,796.843 3,521.474 1.16 267
🥈 lmdb 2 4.28 ops/sec 233,525.819 227,006.958 237,819.161 1.02 10.00

transaction sync > optimistic > rollback operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 16.32K ops/sec 61.28 58.49 333.201 0.377 8,159
🥈 rocksdb 2 5.49K ops/sec 182.064 172.356 815.158 0.310 2,747

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.88K ops/sec 346.688 320.211 561.83 0.271 1,443
🥈 rocksdb 2 559.75 ops/sec 1,786.517 1,715.164 3,916.37 0.951 280

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 367.43 ops/sec 2,721.633 2,197.348 5,845.862 1.59 184
🥈 lmdb 2 4.22 ops/sec 236,804.832 230,832.909 255,295.371 2.12 10.00

transaction sync > optimistic > empty transaction overhead

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 786.45K ops/sec 1.27 1.09 1,622.987 0.787 393,226
🥈 rocksdb 2 90.49K ops/sec 11.05 9.97 2,413.63 1.22 45,245

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 1.54K ops/sec 647.714 590.598 4,249.979 3.10 772
🥈 rocksdb 2 250.85 ops/sec 3,986.494 3,729.376 9,781.688 3.22 126

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 507.96 ops/sec 1,968.671 1,910.388 2,236.175 0.318 254
🥈 lmdb 2 4.24 ops/sec 235,815.104 228,691.759 255,457.985 2.99 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 272.58 ops/sec 3,668.678 2,943.541 5,757.632 2.69 137
🥈 lmdb 2 3.36 ops/sec 297,201.096 288,112.075 330,095.35 3.08 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 451.259 365.184 586.85 0.234 1,109
🥈 lmdb 2 269.82 ops/sec 3,706.169 3,169.7 9,592.132 5.09 135

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 227.39 ops/sec 4,397.686 3,818.409 6,295.257 2.37 114
🥈 lmdb 2 3.52 ops/sec 284,363.927 262,173.866 306,486.263 3.11 10.00

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 910.51 ops/sec 1,098.286 954.037 3,682.855 3.18 456
🥈 lmdb 2 305.11 ops/sec 3,277.557 2,166.31 6,857.817 3.44 153

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.659 190.931 747.639 0.518 2,432
🥈 lmdb 2 297.17 ops/sec 3,365.105 3,038.276 6,404.199 1.27 149

transaction > optimistic > rocksdb - large transaction vs many small

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 2.24K ops/sec 445.651 368.371 777.812 0.432 1,122
🥈 rocksdb 2 302.81 ops/sec 3,302.374 2,785.704 7,870.851 3.86 152

transaction > optimistic > lmdb - large transaction vs many small

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 298.90 ops/sec 3,345.566 3,111.506 3,682.923 0.367 150
🥈 lmdb 2 3.61 ops/sec 277,234.534 261,783.411 301,215.953 2.56 10.00

transaction > optimistic > empty transaction overhead

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 39.02K ops/sec 25.63 18.56 407.304 0.530 19,508
🥈 rocksdb 2 35.57K ops/sec 28.12 21.09 4,555.648 2.67 17,785

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

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 lmdb 1 348.35 ops/sec 2,870.701 2,545.146 22,642.497 9.08 175
🥈 rocksdb 2 130.93 ops/sec 7,637.844 6,705.806 14,583.003 2.91 66.00

transaction > pessimistic > simple put operations (100 records)

Implementation Rank Operations/sec Mean (ms) Min (ms) Max (ms) RME (%) Samples
🥇 rocksdb 1 273.43 ops/sec 3,657.299 3,087.86 11,439.799 3.30 137
🥈 lmdb 2 3.58 ops/sec 279,528.772 268,819.952 303,948.503 2.75 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.85K ops/sec 63.10 56.99 5,541.528 2.18 7,924
🥈 rocksdb 2 3.73K ops/sec 267.942 224.43 1,457.863 1.02 1,867

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.80K ops/sec 72.45 61.38 6,219.37 2.46 6,902
🥈 rocksdb 2 3.34K ops/sec 299.493 242.104 1,760.995 1.38 1,670

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.29K ops/sec 137.192 120.238 6,649.02 2.59 3,645
🥈 rocksdb 2 1.65K ops/sec 604.726 515.144 4,249.347 2.55 827

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.80K ops/sec 554.399 501.204 2,192.268 1.03 902
🥈 lmdb 2 4.09 ops/sec 244,494.032 233,726.919 262,721.107 2.96 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.43K ops/sec 700.455 655.701 2,472.432 0.737 714
🥈 lmdb 2 2.15 ops/sec 465,015.052 443,067.792 488,855.138 2.25 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 806.63 ops/sec 1,239.719 1,130.455 5,426.633 1.82 404
🥈 lmdb 2 1.13 ops/sec 887,458.636 807,605.35 1,002,072.537 5.53 10.00

Results from commit 47be8be

@cb1kenobi cb1kenobi merged commit 97e8405 into main Oct 14, 2025
39 of 40 checks passed
@cb1kenobi cb1kenobi deleted the license branch December 3, 2025 20:27
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.

4 participants