feature |
weaselab |
fdb |
based on |
node-copying treap |
node-copying treap |
branch-free child function |
✅ |
❌ |
bytes per node (worst-case) |
64 + kv len + 1* |
96 + kv len |
cheaper iteration* |
❌ |
✅ |
efficient bulk queries |
✅ |
❌ |
entries per set (worst-case) |
1 |
3 |
memory-usage (rough) |
40% |
100% |
node gc |
mark-and-sweep |
reference-counting |
pointer size |
32-bit |
64-bit |
purge strategy |
scan |
search |
read from foreign thread |
✅ |
❌ |
recursion-free |
✅ |
❌ |
returns node memory to OS |
✅ |
❌ |
searches per point clear |
1 |
5 |
searches per range clear |
2 |
5 |
searches per set (worst-case) |
1 |
4 |
* Part of a set of tradeoffs that enable 1 entry per set worst-case
benchmarks
weaselab
ns/op |
op/s |
err% |
total |
benchmark |
1,538.88 |
649,824.01 |
2.7% |
0.22 |
monotonically increasing |
1.25 |
798,888,023.37 |
0.0% |
0.01 |
*iter |
32.10 |
31,153,434.23 |
0.7% |
0.01 |
++iter |
31.08 |
32,178,831.30 |
0.3% |
0.01 |
--iter |
139.19 |
7,184,433.93 |
2.2% |
0.02 |
begin |
176.43 |
5,667,847.59 |
0.3% |
0.02 |
begin (firstGeq) |
54.56 |
18,329,336.92 |
0.4% |
0.01 |
end |
159.37 |
6,274,892.80 |
0.1% |
0.10 |
bulkFirstGeq |
153.55 |
6,512,408.74 |
0.1% |
0.09 |
bulkFirstGeq (latest version) |
fdb
ns/op |
op/s |
err% |
total |
benchmark |
2,236.83 |
447,061.26 |
1.0% |
0.29 |
monotonically increasing |
2.11 |
473,370,596.42 |
0.9% |
0.01 |
*iter |
12.07 |
82,858,977.78 |
1.2% |
0.01 |
++iter |
8.54 |
117,158,071.80 |
0.9% |
0.01 |
--iter |
94.26 |
10,608,588.66 |
1.1% |
0.01 |
begin |
159.01 |
6,288,940.61 |
0.4% |
0.02 |
begin (firstGeq) |
73.47 |
13,610,276.41 |
0.9% |
0.01 |
end |
422.53 |
2,366,723.10 |
0.1% |
0.25 |
bulkFirstGeq |
365.13 |
2,738,758.86 |
0.1% |
0.22 |
bulkFirstGeq (latest version) |