2024-11-20 12:07:32 -08:00
2024-11-15 15:47:32 -08:00
2024-11-18 14:05:14 -08:00
2024-11-19 13:24:13 -08:00
2024-11-15 16:49:21 -08:00
2024-08-30 16:06:43 -07:00
2024-09-09 20:10:55 -07:00
2024-11-10 21:47:26 -08:00
2024-11-19 09:02:16 -08:00
2024-11-12 17:50:27 -08:00
2024-11-19 09:02:16 -08:00

A data structure for optimistic concurrency control on ranges of bitwise-lexicographically-ordered keys.

Intended as an alternative to FoundationDB's skip list.

Hardware for all benchmarks is an AMD Ryzen 9 7900 with (2x32GB) 5600MT/s CL28-34-34-89 1.35V RAM.

$ clang++ --version

Ubuntu clang version 20.0.0 (++20241119082716+7e85cb8a8a9d-1~exp1~20241119082825.551)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-20/bin

Microbenchmark

Skip list

ns/op op/s err% ins/op cyc/op IPC bra/op miss% total benchmark
169.16 5,911,582.44 0.0% 3,014.03 855.12 3.525 504.59 0.0% 2.02 point reads
167.17 5,981,796.19 0.0% 2,954.16 845.14 3.495 490.17 0.0% 2.00 prefix reads
250.44 3,992,954.35 0.1% 3,592.41 1,265.18 2.839 629.31 0.0% 2.99 range reads
467.10 2,140,846.36 0.0% 4,450.57 2,488.36 1.789 707.92 2.1% 5.62 point writes
465.18 2,149,723.11 0.2% 4,410.22 2,474.92 1.782 694.74 2.1% 5.55 prefix writes
297.45 3,361,954.05 0.1% 2,315.38 1,581.64 1.464 396.69 3.3% 3.57 range writes
476.56 2,098,370.82 1.0% 6,999.33 2,492.26 2.808 1,251.74 1.3% 0.06 monotonic increasing point writes
129,455.00 7,724.69 1.0% 807,446.67 698,559.40 1.156 144,584.60 0.8% 0.01 worst case for radix tree
44.67 22,384,996.63 0.5% 902.00 235.18 3.835 132.00 0.0% 0.01 create and destroy

Radix tree (this implementation)

ns/op op/s err% ins/op cyc/op IPC bra/op miss% total benchmark
14.11 70,857,435.19 0.1% 247.13 71.03 3.479 32.64 0.8% 0.17 point reads
15.63 63,997,306.79 0.0% 299.99 78.59 3.817 42.50 0.4% 0.19 prefix reads
36.24 27,590,266.59 0.1% 782.70 182.21 4.296 106.65 0.2% 0.43 range reads
22.72 44,004,627.40 0.1% 376.04 114.33 3.289 49.97 0.8% 0.27 point writes
40.83 24,494,110.04 0.0% 666.07 205.35 3.244 101.33 0.3% 0.49 prefix writes
43.45 23,016,324.00 0.0% 732.33 218.41 3.353 111.64 0.1% 0.53 range writes
81.46 12,276,650.63 3.6% 1,458.85 411.52 3.545 280.42 0.1% 0.01 monotonic increasing point writes
314,217.00 3,182.51 1.2% 4,043,063.50 1,593,715.00 2.537 714,828.00 0.1% 0.01 worst case for radix tree
106.79 9,364,602.60 0.5% 2,046.00 539.75 3.791 329.00 0.0% 0.01 create and destroy

"Real data" test

Point queries only. Gc ratio is the ratio of time spent doing garbage collection to time spent adding writes or doing garbage collection. Lower is better.

skip list

Check: 4.62434 seconds, 364.633 MB/s, Add: 3.90399 seconds, 147.371 MB/s, Gc ratio: 33.6898%, Peak idle memory: 5.61007e+06

radix tree

Check: 0.956689 seconds, 1762.52 MB/s, Add: 1.35744 seconds, 423.84 MB/s, Gc ratio: 35.0946%, Peak idle memory: 2.32922e+06

hash table

(The hash table implementation doesn't work on range queries, and its purpose is to provide an idea of how fast point queries can be)

Check: 0.799863 seconds, 2108.09 MB/s, Add: 0.667736 seconds, 861.621 MB/s, Gc ratio: 35.0666%, Peak idle memory: 0
Description
A data structure for optimistic concurrency control on ranges of bitwise-lexicographically-ordered keys.
Readme 25 MiB
v0.0.13 Latest
2024-08-26 21:24:21 +00:00
Languages
C++ 82.9%
TeX 8.1%
CMake 4.8%
Python 2.7%
Shell 0.9%
Other 0.6%