diff --git a/README.md b/README.md index cd930b2..9a73c2e 100644 --- a/README.md +++ b/README.md @@ -2,54 +2,56 @@ A data structure for optimistic concurrency control on ranges of bitwise-lexicog Intended to replace FoundationDB's skip list. +Hardware for all benchmarks is a mac m1 2020. + # FoundationDB's benchmark ## Skip list ``` -New conflict set: 2.404 sec - 0.520 Mtransactions/sec - 2.080 Mkeys/sec -Detect only: 2.266 sec - 0.552 Mtransactions/sec - 2.207 Mkeys/sec -Skiplist only: 1.594 sec - 0.784 Mtransactions/sec - 3.137 Mkeys/sec +New conflict set: 1.962 sec + 0.637 Mtransactions/sec + 2.549 Mkeys/sec +Detect only: 1.853 sec + 0.674 Mtransactions/sec + 2.698 Mkeys/sec +Skiplist only: 1.269 sec + 0.985 Mtransactions/sec + 3.940 Mkeys/sec Performance counters: - Build: 0.071 - Add: 0.0641 - Detect: 2.27 - D.Sort: 0.44 - D.Combine: 0.018 - D.CheckRead: 0.855 - D.CheckIntraBatch: 0.00903 - D.MergeWrite: 0.739 - D.RemoveBefore: 0.201 + Build: 0.0526 + Add: 0.054 + Detect: 1.85 + D.Sort: 0.413 + D.Combine: 0.0148 + D.CheckRead: 0.678 + D.CheckIntraBatch: 0.00679 + D.MergeWrite: 0.591 + D.RemoveBefore: 0.147 ``` ## Radix tree (this implementation) ``` -New conflict set: 1.743 sec - 0.717 Mtransactions/sec - 2.869 Mkeys/sec -Detect only: 1.611 sec - 0.776 Mtransactions/sec - 3.103 Mkeys/sec -Skiplist only: 0.919 sec - 1.360 Mtransactions/sec - 5.440 Mkeys/sec +New conflict set: 1.342 sec + 0.931 Mtransactions/sec + 3.726 Mkeys/sec +Detect only: 1.227 sec + 1.018 Mtransactions/sec + 4.074 Mkeys/sec +Skiplist only: 0.576 sec + 2.169 Mtransactions/sec + 8.676 Mkeys/sec Performance counters: - Build: 0.0657 - Add: 0.0628 - Detect: 1.61 - D.Sort: 0.442 - D.Combine: 0.0178 - D.CheckRead: 0.395 - D.CheckIntraBatch: 0.00776 - D.MergeWrite: 0.524 - D.RemoveBefore: 0.221 + Build: 0.0568 + Add: 0.0564 + Detect: 1.23 + D.Sort: 0.414 + D.Combine: 0.0162 + D.CheckRead: 0.228 + D.CheckIntraBatch: 0.00665 + D.MergeWrite: 0.348 + D.RemoveBefore: 0.211 ``` # Our benchmark @@ -58,25 +60,25 @@ Performance counters: | ns/op | op/s | err% | total | benchmark |--------------------:|--------------------:|--------:|----------:|:---------- -| 270.07 | 3,702,706.03 | 0.4% | 0.01 | `point reads` -| 285.76 | 3,499,437.03 | 1.5% | 0.01 | `prefix reads` -| 532.54 | 1,877,794.90 | 0.7% | 0.01 | `range reads` -| 528.50 | 1,892,132.94 | 0.7% | 0.01 | `point writes` -| 516.53 | 1,935,978.22 | 0.9% | 0.01 | `prefix writes` -| 303.34 | 3,296,630.84 | 3.6% | 0.05 | `range writes` -| 502.88 | 1,988,553.24 | 2.0% | 0.01 | `monotonic increasing point writes` +| 254.17 | 3,934,426.23 | 0.3% | 0.01 | `point reads` +| 275.58 | 3,628,769.92 | 2.1% | 0.01 | `prefix reads` +| 494.87 | 2,020,718.51 | 0.7% | 0.01 | `range reads` +| 495.91 | 2,016,512.61 | 1.7% | 0.01 | `point writes` +| 478.11 | 2,091,578.00 | 0.8% | 0.01 | `prefix writes` +| 307.08 | 3,256,480.40 | 1.9% | 0.04 | `range writes` +| 610.89 | 1,636,953.81 | 0.7% | 0.01 | `monotonic increasing point writes` ## Radix tree (this implementation) | ns/op | op/s | err% | total | benchmark |--------------------:|--------------------:|--------:|----------:|:---------- -| 14.52 | 68,850,842.99 | 1.2% | 0.01 | `point reads` -| 60.89 | 16,422,538.22 | 1.5% | 0.01 | `prefix reads` -| 226.89 | 4,407,362.98 | 0.5% | 0.01 | `range reads` -| 22.99 | 43,498,198.49 | 0.2% | 0.01 | `point writes` -| 50.51 | 19,799,864.54 | 1.0% | 0.01 | `prefix writes` -| 82.50 | 12,121,212.12 | 2.6% | 0.03 | `range writes` -| 119.94 | 8,337,354.54 | 2.1% | 0.01 | `monotonic increasing point writes` +| 22.39 | 44,667,832.17 | 0.2% | 0.01 | `point reads` +| 53.89 | 18,554,840.41 | 3.4% | 0.01 | `prefix reads` +| 217.71 | 4,593,220.24 | 0.2% | 0.01 | `range reads` +| 29.72 | 33,642,099.66 | 1.1% | 0.01 | `point writes` +| 44.86 | 22,294,037.02 | 0.8% | 0.01 | `prefix writes` +| 55.00 | 18,181,818.18 | 0.8% | 0.03 | `range writes` +| 109.21 | 9,156,917.53 | 2.9% | 0.01 | `monotonic increasing point writes` # "Real data" test @@ -85,13 +87,13 @@ Point queries only, best of three runs. Gc ratio is the ratio of time spent doin ## skip list ``` -Check: 12.7863 seconds, 292.384 MB/s, Add: 19.8276 seconds, 35.4071 MB/s, Gc ratio: 23.5314% +Check: 11.7282 seconds, 318.763 MB/s, Add: 5.76499 seconds, 121.776 MB/s, Gc ratio: 48.0772% ``` ## radix tree ``` -Check: 3.60187 seconds, 1037.94 MB/s, Add: 3.03958 seconds, 230.966 MB/s, Gc ratio: 52.3876% +Check: 3.27475 seconds, 1141.62 MB/s, Add: 2.13594 seconds, 328.678 MB/s, Gc ratio: 50.1739% ``` ## hash table @@ -99,5 +101,5 @@ Check: 3.60187 seconds, 1037.94 MB/s, Add: 3.03958 seconds, 230.966 MB/s, Gc rat (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: 2.15925 seconds, 1731.4 MB/s, Add: 1.08519 seconds, 646.926 MB/s, Gc ratio: 52.1526% +Check: 1.86291 seconds, 2006.81 MB/s, Add: 0.923653 seconds, 760.067 MB/s, Gc ratio: 54.2605% ``` \ No newline at end of file