diff --git a/README.md b/README.md index 2a754e1..37b3efc 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ counters take 2–4 KiB per CPU. | | Use it when | Watch out for | |:---|:---|:---| -| `tinylfu` | **in doubt**: the workload is unknown, or has loops or scans, and is read far more than written | Evicting writes are 5–10% slower than in `s3fifo`, and with 1% writes on 8 CPUs it was 22% slower, for a reason not yet found. Hit ratios vary between runs by up to 5.6 points. | +| `tinylfu` | **in doubt**: the workload is unknown, or has loops or scans, and is read far more than written | Evicting writes are 8–13% slower than in `s3fifo`. Hit ratios vary between runs by up to 5.6 points. | | `s3fifo` | you want the same results on every run, or the workload has no loops | Falls far behind on looping workloads: on Mixed, at some sizes, it hits as rarely as `lru`. Writes cost about twice what they do in `lru`. | | `sieve` | reading through has to be as fast as possible, and you have checked your workload | It can collapse: on Mixed it answers under 1% of requests where `lru` answers 44%; see [when not to use it](https://pkg.go.dev/github.com/floatdrop/evict/sieve#hdr-When_not_to_use_it). | | `twoq` | a quarter or more of the operations are writes, or one goroutine uses the cache | Reads take a lock; more memory than `lru`. | @@ -158,21 +158,21 @@ Millions of operations per second on one CPU and on eight (`1 → 8`), against a | Benchmark | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | |:---|---:|---:|---:|---:|---:|---:|---:| -| `Get`: reads, all of them hits | 39.7 → 35.9 | 46.7 → 44.4 | 35.6 → 265.8 | 36.1 → 274.7 | 35.0 → 258.1 | 27.2 → 202.3 | 34.2 → 4.3 | -| `Mixed`: the same, 10% of them writes | 37.6 → 34.0 | 42.5 → 42.8 | 32.9 → 68.6 | 33.4 → 69.9 | 33.1 → 62.6 | 21.7 → 80.8 | 33.5 → 4.4 | -| `Set`: writes that replace | 36.5 → 24.9 | 43.3 → 28.4 | 22.4 → 13.8 | 22.5 → 13.6 | 22.2 → 12.8 | 8.9 → 15.9 | 32.1 → 4.3 | -| `Evict`: writes that evict | 16.5 → 31.3 | 16.9 → 30.9 | 13.4 → 12.0 | 8.6 → 10.5 | 8.2 → 9.8 | 3.6 → 5.9 | 7.5 → 3.3 | -| `ReadThrough`: read, store on a miss | 30.3 → 34.1 | 31.9 → 33.7 | 28.6 → 53.3 | 22.1 → 43.1 | 21.7 → 46.0 | 12.7 → 23.6 | 16.7 → 3.6 | -| `ReadThrough`, a million entries | 8.8 → 30.1 | 8.4 → 28.7 | 8.9 → 41.5 | 7.2 → 36.8 | 7.5 → 37.8 | 4.3 → 17.9 | 6.3 → 2.9 | +| `Get`: reads, all of them hits | 40.2 → 34.7 | 47.3 → 44.9 | 40.1 → 317.8 | 40.7 → 308.7 | 38.9 → 307.0 | 26.1 → 204.7 | 33.1 → 4.2 | +| `Mixed`: the same, 10% of them writes | 40.3 → 32.4 | 46.4 → 38.9 | 35.7 → 71.6 | 36.6 → 64.2 | 35.3 → 61.4 | 19.7 → 80.3 | 33.3 → 3.8 | +| `Set`: writes that replace | 38.1 → 24.1 | 44.0 → 26.9 | 22.0 → 11.8 | 22.4 → 12.6 | 22.5 → 11.6 | 8.7 → 15.3 | 31.8 → 3.6 | +| `Evict`: writes that evict | 17.8 → 31.6 | 16.9 → 30.3 | 14.4 → 12.0 | 9.6 → 10.3 | 8.4 → 9.5 | 3.4 → 5.6 | 7.1 → 3.2 | +| `ReadThrough`: read, store on a miss | 31.3 → 35.3 | 30.6 → 35.9 | 31.3 → 55.1 | 23.8 → 42.2 | 22.7 → 46.0 | 10.9 → 22.8 | 16.2 → 3.4 | +| `ReadThrough`, a million entries | 7.2 → 28.6 | 7.6 → 27.3 | 7.3 → 41.1 | 6.8 → 35.5 | 6.8 → 37.3 | 4.0 → 17.2 | 5.9 → 2.7 | ![Throughput of ReadThrough with a million entries by number of CPUs](bench/results/throughput-readthrough-capacity-1m.svg) -- Lock-free reads scale: on 8 CPUs `sieve`, `s3fifo` and `tinylfu` read 28–36% faster than +- Lock-free reads scale: on 8 CPUs `sieve`, `s3fifo` and `tinylfu` read 50–55% faster than otter, while `lru` and `twoq` slow down past 4 CPUs. -- On one CPU all five caches beat otter at everything, by 1.3 to 5 times. +- On one CPU all five caches beat otter at everything, by 1.5 to 5 times. - `lru` and `twoq` change entries in place and write fastest. The lock-free caches move a replaced entry to a fresh node so that readers need no lock, and their writes cost 1.2 to - 3.4 times as much. + 3.3 times as much. - Otter wins on 8 CPUs when 10–25% of the operations overwrite entries. - These are numbers from one machine. Otter's own, from Linux on x86, show its writes scaling five-fold from one CPU to eight, against less than two-fold here. @@ -184,25 +184,24 @@ Bytes per entry with `uint64` keys and values, over caches of 10,000 to 10 milli | | Bytes per entry | of which the GC scans | One GC cycle, 1M entries | 10M entries | |:---|---:|---:|---:|---:| -| evict/lru | 46–58 | 0–1 | 0.2 ms | 0.2 ms | -| evict/sieve | 54–72 | 0–2 | 0.4 ms | 0.2 ms | -| evict/twoq | 74–82 | 0–1 | 0.4 ms | 0.2 ms | -| evict/s3fifo | 68–90 | 0–2 | 0.3 ms | 0.2 ms | -| evict/tinylfu | 67–82 | 0–2 | 0.4 ms | 0.2 ms | -| otter | 83–94 | 40–50 | 64 ms | 634 ms | -| golang-lru | 110–127 | 93–111 | 65 ms | 740 ms | -| golang-lru/2q | 156–183 | 136–163 | 97 ms | 1,167 ms | - -Sizes swing with capacity because indexes come in powers of two. The garbage collector's -work does not: it grows with caches built from pointers and stays near zero for these. That -holds for keys and values without pointers; what strings cost the collector was not -measured. +| evict/lru | 56–63 | 0–2 | 0.2 ms | 0.2 ms | +| evict/sieve | 64–81 | 0–2 | 0.3 ms | 0.3 ms | +| evict/twoq | 84–93 | 0–1 | 0.3 ms | 0.2 ms | +| evict/s3fifo | 82–100 | 0–2 | 0.5 ms | 0.2 ms | +| evict/tinylfu | 76–95 | 0–2 | 0.4 ms | 0.2 ms | +| otter | 83–95 | 40–50 | 65 ms | 530 ms | +| golang-lru | 110–127 | 94–111 | 66 ms | 719 ms | +| golang-lru/2q | 156–183 | 136–163 | 101 ms | 1,157 ms | + +The garbage collector's work grows with caches built from pointers and stays near zero for +these. That holds for keys and values without pointers; what strings cost the collector +was not measured. ## How it works - **Arrays, not pointers.** Each shard allocates its nodes once and links them by 32-bit - index. An open-addressing index maps a 32-bit hash to a node, so a lookup compares hashes - before it touches an entry. + index. An open-addressing index with three slots per entry maps a 32-bit hash to a node, + so a lookup compares hashes before it touches an entry. - **Shards.** The upper half of a key's hash picks a shard, which writers lock on its own; the lower half indexes the key within it. Each shard evicts from its own share of the capacity. A cache under 512 entries is one shard; a larger one has up to eight per CPU, of diff --git a/bench/cmd/tune/main.go b/bench/cmd/tune/main.go index 43a8282..0947163 100644 --- a/bench/cmd/tune/main.go +++ b/bench/cmd/tune/main.go @@ -380,7 +380,7 @@ The caches are in one piece. A setting is written as the options that make it: `+"`small`"+` is WithSmallRatio, `+"`ghosts`"+` WithGhostRatio, `+"`promotion`"+` WithPromotionReads and `+"`returns`"+` WithGhostReturns. Where settings do equally well, the standard one is named before the others, and one with fewer ghosts before one with more: a ghost takes about -sixteen bytes. +twenty bytes. Produced by `+"`%s`"+` with %s. diff --git a/bench/results/memory.md b/bench/results/memory.md index 235a830..0e9c282 100644 --- a/bench/results/memory.md +++ b/bench/results/memory.md @@ -13,14 +13,14 @@ caches of this module store them in place. | cache | 10,000 | 100,000 | 1,000,000 | 10,000,000 | |:---|---:|---:|---:|---:| -| evict/lru | 47.5 | 57.9 | 49.3 | 45.5 | -| evict/twoq | 79.6 | 73.6 | 81.8 | 74.9 | -| evict/sieve | 67.9 | 71.5 | 59.8 | 53.7 | -| evict/s3fifo | 82.3 | 89.9 | 75.6 | 67.7 | -| evict/tinylfu | 81.4 | 82.0 | 68.2 | 67.2 | -| otter | 94.0 | 82.9 | 90.5 | 89.2 | +| evict/lru | 61.4 | 63.1 | 56.6 | 56.0 | +| evict/twoq | 92.7 | 89.3 | 84.4 | 84.0 | +| evict/sieve | 81.4 | 76.7 | 67.2 | 64.3 | +| evict/s3fifo | 100.2 | 96.4 | 85.5 | 82.4 | +| evict/tinylfu | 94.9 | 87.3 | 75.6 | 77.8 | +| otter | 94.9 | 83.1 | 90.5 | 89.2 | | golang-lru | 109.6 | 127.3 | 117.8 | 110.3 | -| golang-lru/2q | 156.4 | 182.9 | 168.8 | 157.5 | +| golang-lru/2q | 156.4 | 182.9 | 168.8 | 157.4 | ## Strings @@ -29,14 +29,14 @@ overhead of the cache alone, including the 32 bytes of the two string headers. | cache | 10,000 | 100,000 | 1,000,000 | 10,000,000 | |:---|---:|---:|---:|---:| -| evict/lru | 66.2 | 73.5 | 65.0 | 61.4 | -| evict/twoq | 105.8 | 94.6 | 105.9 | 98.9 | -| evict/sieve | 83.4 | 87.1 | 77.1 | 69.8 | -| evict/s3fifo | 97.8 | 105.6 | 92.9 | 83.8 | -| evict/tinylfu | 97.0 | 97.7 | 85.5 | 83.3 | -| otter | 106.5 | 97.6 | 106.4 | 105.2 | +| evict/lru | 79.6 | 78.8 | 72.4 | 72.0 | +| evict/twoq | 118.9 | 110.3 | 108.5 | 108.1 | +| evict/sieve | 96.9 | 92.4 | 84.5 | 80.4 | +| evict/s3fifo | 115.7 | 112.2 | 102.8 | 98.5 | +| evict/tinylfu | 110.4 | 103.0 | 92.9 | 93.9 | +| otter | 106.5 | 97.6 | 106.5 | 105.2 | | golang-lru | 139.7 | 165.9 | 151.9 | 140.8 | -| golang-lru/2q | 201.6 | 240.9 | 219.9 | 203.1 | +| golang-lru/2q | 201.6 | 240.9 | 219.9 | 203.2 | ## Garbage collection @@ -50,14 +50,14 @@ one run to the next. | cache | 10,000 | 100,000 | 1,000,000 | 10,000,000 | |:---|---:|---:|---:|---:| -| evict/lru | 0.7 | 0.2 | 0.0 | 0.0 | -| evict/twoq | 0.7 | 0.2 | 0.0 | 0.0 | -| evict/sieve | 1.6 | 0.3 | 0.0 | 0.0 | -| evict/s3fifo | 1.9 | 0.4 | 0.0 | 0.0 | -| evict/tinylfu | 1.9 | 0.4 | 0.0 | 0.0 | -| otter | 48.3 | 40.1 | 50.1 | 43.8 | -| golang-lru | 93.4 | 111.3 | 101.8 | 94.3 | -| golang-lru/2q | 136.3 | 162.9 | 148.7 | 137.4 | +| evict/lru | 1.5 | 0.2 | 0.0 | 0.0 | +| evict/twoq | 0.9 | 0.2 | 0.0 | 0.0 | +| evict/sieve | 1.8 | 0.3 | 0.0 | 0.0 | +| evict/s3fifo | 2.2 | 0.4 | 0.0 | 0.0 | +| evict/tinylfu | 2.2 | 0.4 | 0.0 | 0.0 | +| otter | 49.0 | 40.3 | 50.1 | 43.8 | +| golang-lru | 93.5 | 111.3 | 101.8 | 94.3 | +| golang-lru/2q | 136.1 | 162.9 | 148.7 | 137.4 | The second has the CPU time that one collection takes while the cache is alive and little else is, in milliseconds: the least and the most of seven collections. It is the @@ -67,11 +67,11 @@ lower number is the one to go by. | cache | 10,000 | 100,000 | 1,000,000 | 10,000,000 | |:---|---:|---:|---:|---:| -| evict/lru | 0.36–0.63 | 0.27–0.53 | 0.16–0.31 | 0.20–0.34 | -| evict/twoq | 0.36–0.53 | 0.35–0.56 | 0.35–0.47 | 0.22–0.39 | -| evict/sieve | 0.39–0.51 | 0.28–0.55 | 0.42–0.53 | 0.19–0.33 | -| evict/s3fifo | 0.43–0.56 | 0.33–1.03 | 0.34–0.61 | 0.23–0.37 | -| evict/tinylfu | 0.39–0.61 | 0.36–0.48 | 0.38–0.56 | 0.19–0.38 | -| otter | 0.67–1.12 | 5.94–6.60 | 64.28–68.37 | 633.72–653.00 | -| golang-lru | 1.30–1.61 | 8.50–9.00 | 64.80–67.87 | 740.43–863.89 | -| golang-lru/2q | 1.26–2.21 | 11.84–12.96 | 97.42–102.44 | 1167.18–1230.22 | +| evict/lru | 0.43–0.55 | 0.25–0.41 | 0.17–0.28 | 0.19–0.37 | +| evict/twoq | 0.34–0.48 | 0.32–0.60 | 0.34–0.49 | 0.22–0.34 | +| evict/sieve | 0.28–0.62 | 0.32–0.53 | 0.29–0.61 | 0.29–0.83 | +| evict/s3fifo | 0.32–0.74 | 0.48–1.20 | 0.46–0.98 | 0.24–0.40 | +| evict/tinylfu | 0.41–0.59 | 0.33–0.59 | 0.35–0.59 | 0.22–0.34 | +| otter | 0.63–0.88 | 5.48–6.25 | 65.18–69.80 | 530.03–584.60 | +| golang-lru | 1.25–1.69 | 7.34–9.69 | 66.21–72.52 | 719.26–828.59 | +| golang-lru/2q | 1.63–2.02 | 11.80–13.09 | 100.53–109.53 | 1157.10–1312.65 | diff --git a/bench/results/throughput-evict.svg b/bench/results/throughput-evict.svg index a40e865..db099d0 100644 --- a/bench/results/throughput-evict.svg +++ b/bench/results/throughput-evict.svg @@ -66,44 +66,44 @@ text { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; } 4 8 CPUs - - - - - - - - -evict/lru at 1: 16.51 -evict/lru at 2: 22.47 -evict/lru at 4: 36.29 -evict/lru at 8: 31.34 -evict/twoq at 1: 16.92 -evict/twoq at 2: 23.69 -evict/twoq at 4: 37.86 -evict/twoq at 8: 30.92 -evict/sieve at 1: 13.40 -evict/sieve at 2: 13.99 -evict/sieve at 4: 18.72 + + + + + + + + +evict/lru at 1: 17.77 +evict/lru at 2: 24.14 +evict/lru at 4: 37.04 +evict/lru at 8: 31.55 +evict/twoq at 1: 16.86 +evict/twoq at 2: 22.74 +evict/twoq at 4: 33.63 +evict/twoq at 8: 30.29 +evict/sieve at 1: 14.40 +evict/sieve at 2: 14.13 +evict/sieve at 4: 18.41 evict/sieve at 8: 12.00 -evict/s3fifo at 1: 8.61 -evict/s3fifo at 2: 11.06 -evict/s3fifo at 4: 15.76 -evict/s3fifo at 8: 10.48 -evict/tinylfu at 1: 8.17 -evict/tinylfu at 2: 9.95 -evict/tinylfu at 4: 14.35 -evict/tinylfu at 8: 9.81 -otter at 1: 3.57 -otter at 2: 6.23 -otter at 4: 6.56 -otter at 8: 5.93 -golang-lru at 1: 7.48 -golang-lru at 2: 6.25 -golang-lru at 4: 4.37 -golang-lru at 8: 3.27 -golang-lru/2q at 1: 3.73 -golang-lru/2q at 2: 3.53 -golang-lru/2q at 4: 3.02 -golang-lru/2q at 8: 2.29 +evict/s3fifo at 1: 9.60 +evict/s3fifo at 2: 11.14 +evict/s3fifo at 4: 15.10 +evict/s3fifo at 8: 10.29 +evict/tinylfu at 1: 8.36 +evict/tinylfu at 2: 9.98 +evict/tinylfu at 4: 13.59 +evict/tinylfu at 8: 9.54 +otter at 1: 3.44 +otter at 2: 5.91 +otter at 4: 6.06 +otter at 8: 5.58 +golang-lru at 1: 7.09 +golang-lru at 2: 5.79 +golang-lru at 4: 4.11 +golang-lru at 8: 3.16 +golang-lru/2q at 1: 3.44 +golang-lru/2q at 2: 3.06 +golang-lru/2q at 4: 2.82 +golang-lru/2q at 8: 2.40 diff --git a/bench/results/throughput-get.svg b/bench/results/throughput-get.svg index b6f0391..ec038f7 100644 --- a/bench/results/throughput-get.svg +++ b/bench/results/throughput-get.svg @@ -57,52 +57,53 @@ text { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; } golang-lru golang-lru/2q 0 -100 -200 -300 +100 +200 +300 +400 1 2 4 8 CPUs - - - - - - - - -evict/lru at 1: 39.67 -evict/lru at 2: 39.34 -evict/lru at 4: 59.23 -evict/lru at 8: 35.87 -evict/twoq at 1: 46.69 -evict/twoq at 2: 60.59 -evict/twoq at 4: 94.98 -evict/twoq at 8: 44.42 -evict/sieve at 1: 35.63 -evict/sieve at 2: 69.97 -evict/sieve at 4: 142.60 -evict/sieve at 8: 265.80 -evict/s3fifo at 1: 36.15 -evict/s3fifo at 2: 70.85 -evict/s3fifo at 4: 103.20 -evict/s3fifo at 8: 274.70 -evict/tinylfu at 1: 34.99 -evict/tinylfu at 2: 68.45 -evict/tinylfu at 4: 137.60 -evict/tinylfu at 8: 258.10 -otter at 1: 27.24 -otter at 2: 50.90 -otter at 4: 102.90 -otter at 8: 202.30 -golang-lru at 1: 34.20 -golang-lru at 2: 11.75 -golang-lru at 4: 5.89 -golang-lru at 8: 4.35 -golang-lru/2q at 1: 33.14 -golang-lru/2q at 2: 11.87 -golang-lru/2q at 4: 5.92 -golang-lru/2q at 8: 4.36 + + + + + + + + +evict/lru at 1: 40.24 +evict/lru at 2: 38.60 +evict/lru at 4: 56.83 +evict/lru at 8: 34.66 +evict/twoq at 1: 47.29 +evict/twoq at 2: 59.95 +evict/twoq at 4: 88.11 +evict/twoq at 8: 44.93 +evict/sieve at 1: 40.10 +evict/sieve at 2: 80.73 +evict/sieve at 4: 155.70 +evict/sieve at 8: 317.80 +evict/s3fifo at 1: 40.70 +evict/s3fifo at 2: 78.99 +evict/s3fifo at 4: 153.30 +evict/s3fifo at 8: 308.70 +evict/tinylfu at 1: 38.90 +evict/tinylfu at 2: 75.93 +evict/tinylfu at 4: 157.40 +evict/tinylfu at 8: 307.00 +otter at 1: 26.07 +otter at 2: 51.74 +otter at 4: 104.00 +otter at 8: 204.70 +golang-lru at 1: 33.13 +golang-lru at 2: 11.21 +golang-lru at 4: 5.40 +golang-lru at 8: 4.15 +golang-lru/2q at 1: 31.26 +golang-lru/2q at 2: 8.93 +golang-lru/2q at 4: 5.42 +golang-lru/2q at 8: 3.97 diff --git a/bench/results/throughput-mixed-writes-1.svg b/bench/results/throughput-mixed-writes-1.svg index df2f66f..d8a5476 100644 --- a/bench/results/throughput-mixed-writes-1.svg +++ b/bench/results/throughput-mixed-writes-1.svg @@ -67,44 +67,44 @@ text { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; } 4 8 CPUs - - - - - - - - -evict/lru at 1: 36.65 -evict/lru at 2: 38.94 -evict/lru at 4: 61.37 -evict/lru at 8: 34.62 -evict/twoq at 1: 47.08 -evict/twoq at 2: 60.29 -evict/twoq at 4: 72.14 -evict/twoq at 8: 46.65 -evict/sieve at 1: 34.35 -evict/sieve at 2: 64.18 -evict/sieve at 4: 122.00 -evict/sieve at 8: 199.80 -evict/s3fifo at 1: 35.52 -evict/s3fifo at 2: 65.79 -evict/s3fifo at 4: 126.10 -evict/s3fifo at 8: 218.90 -evict/tinylfu at 1: 34.53 -evict/tinylfu at 2: 65.11 -evict/tinylfu at 4: 123.40 -evict/tinylfu at 8: 170.20 -otter at 1: 25.85 -otter at 2: 48.39 -otter at 4: 93.73 -otter at 8: 175.00 -golang-lru at 1: 33.83 -golang-lru at 2: 11.69 -golang-lru at 4: 5.94 -golang-lru at 8: 4.26 -golang-lru/2q at 1: 32.33 -golang-lru/2q at 2: 11.89 -golang-lru/2q at 4: 5.93 -golang-lru/2q at 8: 4.41 + + + + + + + + +evict/lru at 1: 40.79 +evict/lru at 2: 39.10 +evict/lru at 4: 51.83 +evict/lru at 8: 32.88 +evict/twoq at 1: 47.30 +evict/twoq at 2: 53.91 +evict/twoq at 4: 60.05 +evict/twoq at 8: 45.62 +evict/sieve at 1: 39.63 +evict/sieve at 2: 73.31 +evict/sieve at 4: 138.90 +evict/sieve at 8: 244.60 +evict/s3fifo at 1: 40.45 +evict/s3fifo at 2: 72.60 +evict/s3fifo at 4: 132.80 +evict/s3fifo at 8: 228.80 +evict/tinylfu at 1: 39.03 +evict/tinylfu at 2: 71.34 +evict/tinylfu at 4: 128.00 +evict/tinylfu at 8: 232.20 +otter at 1: 25.14 +otter at 2: 46.52 +otter at 4: 91.94 +otter at 8: 177.20 +golang-lru at 1: 33.39 +golang-lru at 2: 11.22 +golang-lru at 4: 5.73 +golang-lru at 8: 3.92 +golang-lru/2q at 1: 31.93 +golang-lru/2q at 2: 11.13 +golang-lru/2q at 4: 5.62 +golang-lru/2q at 8: 4.07 diff --git a/bench/results/throughput-mixed-writes-10.svg b/bench/results/throughput-mixed-writes-10.svg index e102b59..c244d74 100644 --- a/bench/results/throughput-mixed-writes-10.svg +++ b/bench/results/throughput-mixed-writes-10.svg @@ -67,44 +67,44 @@ text { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; } 4 8 CPUs - - - - - - - - -evict/lru at 1: 37.61 -evict/lru at 2: 38.92 -evict/lru at 4: 60.68 -evict/lru at 8: 33.96 -evict/twoq at 1: 42.45 -evict/twoq at 2: 57.70 -evict/twoq at 4: 73.68 -evict/twoq at 8: 42.79 -evict/sieve at 1: 32.92 -evict/sieve at 2: 50.05 -evict/sieve at 4: 91.37 -evict/sieve at 8: 68.56 -evict/s3fifo at 1: 33.40 -evict/s3fifo at 2: 55.23 -evict/s3fifo at 4: 96.48 -evict/s3fifo at 8: 69.87 -evict/tinylfu at 1: 33.12 -evict/tinylfu at 2: 50.58 -evict/tinylfu at 4: 82.23 -evict/tinylfu at 8: 62.59 -otter at 1: 21.74 -otter at 2: 38.00 -otter at 4: 68.37 -otter at 8: 80.85 -golang-lru at 1: 33.45 -golang-lru at 2: 11.70 -golang-lru at 4: 5.89 -golang-lru at 8: 4.43 -golang-lru/2q at 1: 31.43 -golang-lru/2q at 2: 11.75 -golang-lru/2q at 4: 5.87 -golang-lru/2q at 8: 4.45 + + + + + + + + +evict/lru at 1: 40.26 +evict/lru at 2: 37.61 +evict/lru at 4: 43.57 +evict/lru at 8: 32.38 +evict/twoq at 1: 46.44 +evict/twoq at 2: 54.55 +evict/twoq at 4: 69.24 +evict/twoq at 8: 38.88 +evict/sieve at 1: 35.69 +evict/sieve at 2: 46.07 +evict/sieve at 4: 69.09 +evict/sieve at 8: 71.59 +evict/s3fifo at 1: 36.58 +evict/s3fifo at 2: 55.28 +evict/s3fifo at 4: 76.51 +evict/s3fifo at 8: 64.22 +evict/tinylfu at 1: 35.27 +evict/tinylfu at 2: 52.94 +evict/tinylfu at 4: 74.40 +evict/tinylfu at 8: 61.36 +otter at 1: 19.73 +otter at 2: 35.65 +otter at 4: 52.37 +otter at 8: 80.27 +golang-lru at 1: 33.34 +golang-lru at 2: 11.08 +golang-lru at 4: 5.58 +golang-lru at 8: 3.85 +golang-lru/2q at 1: 30.88 +golang-lru/2q at 2: 11.14 +golang-lru/2q at 4: 5.59 +golang-lru/2q at 8: 4.07 diff --git a/bench/results/throughput-mixed-writes-25.svg b/bench/results/throughput-mixed-writes-25.svg index 48341e0..088b6bd 100644 --- a/bench/results/throughput-mixed-writes-25.svg +++ b/bench/results/throughput-mixed-writes-25.svg @@ -57,53 +57,52 @@ text { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; } golang-lru golang-lru/2q 0 -20 -40 -60 -80 +20 +40 +60 1 2 4 8 CPUs - - - - - - - - -evict/lru at 1: 36.18 -evict/lru at 2: 37.90 -evict/lru at 4: 53.56 -evict/lru at 8: 31.31 -evict/twoq at 1: 42.02 -evict/twoq at 2: 53.95 -evict/twoq at 4: 75.57 -evict/twoq at 8: 37.57 -evict/sieve at 1: 30.04 -evict/sieve at 2: 38.70 -evict/sieve at 4: 53.91 -evict/sieve at 8: 37.25 -evict/s3fifo at 1: 29.07 -evict/s3fifo at 2: 40.36 -evict/s3fifo at 4: 59.83 -evict/s3fifo at 8: 36.99 -evict/tinylfu at 1: 28.35 -evict/tinylfu at 2: 36.48 -evict/tinylfu at 4: 48.66 -evict/tinylfu at 8: 34.64 -otter at 1: 17.36 -otter at 2: 28.72 -otter at 4: 49.48 -otter at 8: 46.64 -golang-lru at 1: 32.79 -golang-lru at 2: 11.66 -golang-lru at 4: 5.82 -golang-lru at 8: 4.37 -golang-lru/2q at 1: 29.65 -golang-lru/2q at 2: 11.59 -golang-lru/2q at 4: 5.91 -golang-lru/2q at 8: 4.41 + + + + + + + + +evict/lru at 1: 39.21 +evict/lru at 2: 35.07 +evict/lru at 4: 52.93 +evict/lru at 8: 30.56 +evict/twoq at 1: 40.70 +evict/twoq at 2: 44.68 +evict/twoq at 4: 59.08 +evict/twoq at 8: 36.88 +evict/sieve at 1: 33.01 +evict/sieve at 2: 39.54 +evict/sieve at 4: 45.88 +evict/sieve at 8: 35.70 +evict/s3fifo at 1: 31.93 +evict/s3fifo at 2: 38.52 +evict/s3fifo at 4: 53.87 +evict/s3fifo at 8: 34.86 +evict/tinylfu at 1: 31.42 +evict/tinylfu at 2: 31.74 +evict/tinylfu at 4: 46.57 +evict/tinylfu at 8: 32.90 +otter at 1: 14.07 +otter at 2: 28.13 +otter at 4: 40.44 +otter at 8: 46.47 +golang-lru at 1: 32.52 +golang-lru at 2: 11.00 +golang-lru at 4: 5.68 +golang-lru at 8: 4.04 +golang-lru/2q at 1: 29.67 +golang-lru/2q at 2: 11.19 +golang-lru/2q at 4: 5.65 +golang-lru/2q at 8: 4.09 diff --git a/bench/results/throughput-readthrough-capacity-16k.svg b/bench/results/throughput-readthrough-capacity-16k.svg index d6e656c..88e2141 100644 --- a/bench/results/throughput-readthrough-capacity-16k.svg +++ b/bench/results/throughput-readthrough-capacity-16k.svg @@ -66,44 +66,44 @@ text { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; } 4 8 CPUs - - - - - - - - -evict/lru at 1: 30.26 -evict/lru at 2: 34.37 -evict/lru at 4: 54.21 -evict/lru at 8: 34.09 -evict/twoq at 1: 31.86 -evict/twoq at 2: 35.39 -evict/twoq at 4: 55.07 -evict/twoq at 8: 33.73 -evict/sieve at 1: 28.63 -evict/sieve at 2: 42.86 -evict/sieve at 4: 72.58 -evict/sieve at 8: 53.26 -evict/s3fifo at 1: 22.11 -evict/s3fifo at 2: 35.74 -evict/s3fifo at 4: 62.00 -evict/s3fifo at 8: 43.11 -evict/tinylfu at 1: 21.67 -evict/tinylfu at 2: 34.60 -evict/tinylfu at 4: 59.28 -evict/tinylfu at 8: 46.00 -otter at 1: 12.72 -otter at 2: 19.14 -otter at 4: 39.56 -otter at 8: 23.58 -golang-lru at 1: 16.66 -golang-lru at 2: 8.68 -golang-lru at 4: 4.83 -golang-lru at 8: 3.57 -golang-lru/2q at 1: 10.87 -golang-lru/2q at 2: 6.78 -golang-lru/2q at 4: 4.89 -golang-lru/2q at 8: 3.46 + + + + + + + + +evict/lru at 1: 31.26 +evict/lru at 2: 34.27 +evict/lru at 4: 51.24 +evict/lru at 8: 35.26 +evict/twoq at 1: 30.57 +evict/twoq at 2: 34.32 +evict/twoq at 4: 43.97 +evict/twoq at 8: 35.85 +evict/sieve at 1: 31.28 +evict/sieve at 2: 43.48 +evict/sieve at 4: 68.98 +evict/sieve at 8: 55.15 +evict/s3fifo at 1: 23.82 +evict/s3fifo at 2: 36.97 +evict/s3fifo at 4: 58.78 +evict/s3fifo at 8: 42.21 +evict/tinylfu at 1: 22.69 +evict/tinylfu at 2: 33.45 +evict/tinylfu at 4: 50.38 +evict/tinylfu at 8: 46.05 +otter at 1: 10.94 +otter at 2: 15.27 +otter at 4: 24.93 +otter at 8: 22.84 +golang-lru at 1: 16.22 +golang-lru at 2: 8.01 +golang-lru at 4: 4.70 +golang-lru at 8: 3.36 +golang-lru/2q at 1: 9.58 +golang-lru/2q at 2: 6.29 +golang-lru/2q at 4: 4.78 +golang-lru/2q at 8: 3.30 diff --git a/bench/results/throughput-readthrough-capacity-1m.svg b/bench/results/throughput-readthrough-capacity-1m.svg index 08448cc..c5f7ed0 100644 --- a/bench/results/throughput-readthrough-capacity-1m.svg +++ b/bench/results/throughput-readthrough-capacity-1m.svg @@ -67,44 +67,44 @@ text { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; } 4 8 CPUs - - - - - - - - -evict/lru at 1: 8.84 -evict/lru at 2: 13.49 -evict/lru at 4: 21.55 -evict/lru at 8: 30.09 -evict/twoq at 1: 8.39 -evict/twoq at 2: 11.35 -evict/twoq at 4: 18.05 -evict/twoq at 8: 28.69 -evict/sieve at 1: 8.88 -evict/sieve at 2: 15.74 -evict/sieve at 4: 27.11 -evict/sieve at 8: 41.48 -evict/s3fifo at 1: 7.22 -evict/s3fifo at 2: 12.08 -evict/s3fifo at 4: 21.44 -evict/s3fifo at 8: 36.84 -evict/tinylfu at 1: 7.46 -evict/tinylfu at 2: 12.90 -evict/tinylfu at 4: 23.20 -evict/tinylfu at 8: 37.80 -otter at 1: 4.33 -otter at 2: 8.86 -otter at 4: 15.75 -otter at 8: 17.87 -golang-lru at 1: 6.30 -golang-lru at 2: 3.65 -golang-lru at 4: 3.06 -golang-lru at 8: 2.88 -golang-lru/2q at 1: 4.32 -golang-lru/2q at 2: 2.86 -golang-lru/2q at 4: 2.54 -golang-lru/2q at 8: 2.41 + + + + + + + + +evict/lru at 1: 7.18 +evict/lru at 2: 10.97 +evict/lru at 4: 17.02 +evict/lru at 8: 28.64 +evict/twoq at 1: 7.59 +evict/twoq at 2: 9.89 +evict/twoq at 4: 13.98 +evict/twoq at 8: 27.33 +evict/sieve at 1: 7.32 +evict/sieve at 2: 13.34 +evict/sieve at 4: 20.05 +evict/sieve at 8: 41.11 +evict/s3fifo at 1: 6.83 +evict/s3fifo at 2: 11.89 +evict/s3fifo at 4: 19.05 +evict/s3fifo at 8: 35.50 +evict/tinylfu at 1: 6.83 +evict/tinylfu at 2: 11.06 +evict/tinylfu at 4: 19.20 +evict/tinylfu at 8: 37.29 +otter at 1: 4.04 +otter at 2: 8.48 +otter at 4: 13.00 +otter at 8: 17.22 +golang-lru at 1: 5.86 +golang-lru at 2: 3.03 +golang-lru at 4: 2.92 +golang-lru at 8: 2.68 +golang-lru/2q at 1: 4.08 +golang-lru/2q at 2: 2.61 +golang-lru/2q at 4: 2.40 +golang-lru/2q at 8: 2.30 diff --git a/bench/results/throughput-set.svg b/bench/results/throughput-set.svg index 023e224..7898ddf 100644 --- a/bench/results/throughput-set.svg +++ b/bench/results/throughput-set.svg @@ -57,53 +57,52 @@ text { font-family: system-ui, -apple-system, "Segoe UI", sans-serif; } golang-lru golang-lru/2q 0 -20 -40 -60 -80 +20 +40 +60 1 2 4 8 CPUs - - - - - - - - -evict/lru at 1: 36.55 -evict/lru at 2: 35.99 -evict/lru at 4: 50.58 -evict/lru at 8: 24.90 -evict/twoq at 1: 43.34 -evict/twoq at 2: 45.68 -evict/twoq at 4: 61.07 -evict/twoq at 8: 28.44 -evict/sieve at 1: 22.41 -evict/sieve at 2: 18.78 -evict/sieve at 4: 19.82 -evict/sieve at 8: 13.79 -evict/s3fifo at 1: 22.51 -evict/s3fifo at 2: 19.25 -evict/s3fifo at 4: 21.82 -evict/s3fifo at 8: 13.59 -evict/tinylfu at 1: 22.25 -evict/tinylfu at 2: 17.31 -evict/tinylfu at 4: 17.97 -evict/tinylfu at 8: 12.83 -otter at 1: 8.89 -otter at 2: 14.22 -otter at 4: 22.19 -otter at 8: 15.91 -golang-lru at 1: 32.12 -golang-lru at 2: 11.66 -golang-lru at 4: 5.84 -golang-lru at 8: 4.33 -golang-lru/2q at 1: 26.74 -golang-lru/2q at 2: 10.71 -golang-lru/2q at 4: 5.59 -golang-lru/2q at 8: 4.28 + + + + + + + + +evict/lru at 1: 38.13 +evict/lru at 2: 36.07 +evict/lru at 4: 45.83 +evict/lru at 8: 24.07 +evict/twoq at 1: 44.01 +evict/twoq at 2: 45.95 +evict/twoq at 4: 59.22 +evict/twoq at 8: 26.90 +evict/sieve at 1: 21.98 +evict/sieve at 2: 17.77 +evict/sieve at 4: 18.10 +evict/sieve at 8: 11.85 +evict/s3fifo at 1: 22.37 +evict/s3fifo at 2: 18.15 +evict/s3fifo at 4: 15.57 +evict/s3fifo at 8: 12.62 +evict/tinylfu at 1: 22.53 +evict/tinylfu at 2: 16.50 +evict/tinylfu at 4: 15.91 +evict/tinylfu at 8: 11.55 +otter at 1: 8.66 +otter at 2: 13.70 +otter at 4: 18.89 +otter at 8: 15.32 +golang-lru at 1: 31.78 +golang-lru at 2: 10.94 +golang-lru at 4: 5.44 +golang-lru at 8: 3.60 +golang-lru/2q at 1: 25.60 +golang-lru/2q at 2: 9.99 +golang-lru/2q at 4: 4.88 +golang-lru/2q at 8: 3.94 diff --git a/bench/results/throughput.md b/bench/results/throughput.md index 46ee650..8b1fd18 100644 --- a/bench/results/throughput.md +++ b/bench/results/throughput.md @@ -19,10 +19,10 @@ Measured on Apple M3 Max (darwin/arm64) with go1.27.3, otter v2.4.0, golang-lru | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 39.7 (37.2–40.5) | **46.7** (45.7–50.7) | 35.6 (34.9–36.9) | 36.1 (34.2–36.3) | 35.0 (32.8–35.7) | 27.2 (26.6–27.4) | 34.2 (33.2–35.0) | 33.1 (32.8–33.6) | -| 2 | 39.3 (38.9–40.1) | 60.6 (59.1–61.8) | 70.0 (64.3–71.0) | 70.8 (68.2–72.7) | 68.5 (64.4–69.5) | 50.9 (48.5–52.2) | 11.8 (11.6–11.9) | 11.9 (11.8–12.0) | -| 4 | 59.2 (51.3–61.7) | 95.0 (82.7–97.5) | 142.6 (125.2–144.0) | 103.2 (98.5–139.8) | 137.6 (93.7–140.1) | 102.9 (99.0–105.0) | 5.9 (5.9–6.3) | 5.9 (5.9–6.0) | -| 8 | 35.9 (29.9–37.9) | 44.4 (40.9–47.6) | 265.8 (252.5–287.7) | 274.7 (264.5–285.7) | 258.1 (230.3–274.0) | 202.3 (199.3–205.2) | 4.3 (4.2–4.5) | 4.4 (4.3–4.5) | +| 1 | 40.2 (39.8–42.6) | **47.3** (44.4–51.3) | 40.1 (39.5–42.2) | 40.7 (34.5–43.2) | 38.9 (6.8–40.5) | 26.1 (6.6–27.3) | 33.1 (31.1–34.6) | 31.3 (25.6–33.0) | +| 2 | 38.6 (32.0–40.0) | 60.0 (57.4–62.8) | 80.7 (77.7–84.2) | 79.0 (63.8–83.0) | 75.9 (13.8–79.4) | 51.7 (16.6–52.6) | 11.2 (9.2–11.7) | 8.9 (6.7–11.9) | +| 4 | 56.8 (42.5–58.4) | 88.1 (78.2–90.1) | 155.7 (110.1–162.9) | 153.3 (101.6–165.1) | 157.4 (30.5–160.9) | 104.0 (63.4–105.1) | 5.4 (4.8–5.9) | 5.4 (4.5–5.8) | +| 8 | 34.7 (27.3–36.3) | 44.9 (37.9–47.4) | 317.8 (264.1–329.8) | 308.7 (69.8–327.1) | 307.0 (59.4–314.1) | 204.7 (156.2–207.5) | 4.2 (3.6–4.3) | 4.0 (3.4–4.4) | Every read was answered, by every cache. @@ -32,10 +32,10 @@ Every read was answered, by every cache. | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 36.5 (35.8–37.9) | **43.3** (38.8–45.0) | 22.4 (22.1–22.6) | 22.5 (21.0–22.9) | 22.2 (21.3–22.8) | 8.9 (8.6–9.0) | 32.1 (31.6–33.0) | 26.7 (26.4–26.9) | -| 2 | 36.0 (35.2–37.6) | **45.7** (44.7–47.1) | 18.8 (18.6–18.9) | 19.2 (16.5–19.7) | 17.3 (17.1–17.5) | 14.2 (13.5–14.3) | 11.7 (11.4–11.8) | 10.7 (10.6–11.1) | -| 4 | 50.6 (46.4–52.0) | **61.1** (54.9–67.5) | 19.8 (18.1–21.0) | 21.8 (19.5–22.6) | 18.0 (15.4–18.8) | 22.2 (21.3–22.4) | 5.8 (5.7–6.2) | 5.6 (5.5–5.6) | -| 8 | 24.9 (24.5–26.3) | **28.4** (27.8–30.1) | 13.8 (11.6–14.1) | 13.6 (12.7–14.0) | 12.8 (11.0–13.1) | 15.9 (15.8–16.0) | 4.3 (4.2–4.5) | 4.3 (4.2–4.3) | +| 1 | 38.1 (34.1–39.3) | **44.0** (42.6–44.5) | 22.0 (21.9–23.0) | 22.4 (20.8–23.7) | 22.5 (20.8–23.0) | 8.7 (8.0–8.8) | 31.8 (23.0–32.6) | 25.6 (21.2–27.1) | +| 2 | 36.1 (28.9–36.9) | **46.0** (44.4–46.6) | 17.8 (16.6–18.7) | 18.1 (9.9–18.9) | 16.5 (13.9–17.2) | 13.7 (12.2–14.3) | 10.9 (8.3–11.7) | 10.0 (7.6–10.8) | +| 4 | 45.8 (16.1–49.2) | **59.2** (51.4–63.6) | 18.1 (15.9–20.6) | 15.6 (8.6–19.5) | 15.9 (7.8–18.3) | 18.9 (9.0–21.4) | 5.4 (4.5–5.8) | 4.9 (4.4–5.4) | +| 8 | 24.1 (21.2–26.2) | 26.9 (25.8–27.8) | 11.8 (8.7–13.9) | 12.6 (8.2–14.0) | 11.6 (10.2–12.6) | 15.3 (10.3–15.9) | 3.6 (3.5–4.2) | 3.9 (3.2–4.0) | ### Mixed, writes=1% @@ -43,10 +43,10 @@ Every read was answered, by every cache. | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 36.6 (34.0–38.9) | **47.1** (41.5–48.9) | 34.4 (32.7–35.1) | 35.5 (34.7–36.4) | 34.5 (32.5–35.4) | 25.9 (25.4–26.3) | 33.8 (30.5–34.3) | 32.3 (32.0–33.2) | -| 2 | 38.9 (37.5–40.0) | 60.3 (56.7–61.8) | 64.2 (62.0–68.3) | 65.8 (64.3–68.0) | 65.1 (63.5–67.1) | 48.4 (46.6–49.3) | 11.7 (11.6–12.1) | 11.9 (11.6–12.0) | -| 4 | 61.4 (58.1–63.2) | 72.1 (67.8–91.7) | 122.0 (118.5–128.0) | 126.1 (93.2–129.3) | 123.4 (113.8–128.0) | 93.7 (89.2–94.1) | 5.9 (5.9–6.0) | 5.9 (5.8–6.0) | -| 8 | 34.6 (28.1–37.9) | 46.6 (42.7–48.1) | 199.8 (186.2–213.9) | 218.9 (209.6–224.0) | 170.2 (167.7–198.4) | 175.0 (169.2–176.3) | 4.3 (4.2–4.5) | 4.4 (4.3–4.5) | +| 1 | 40.8 (38.2–41.9) | **47.3** (45.7–49.5) | 39.6 (38.2–41.1) | 40.5 (37.5–41.6) | 39.0 (36.7–41.6) | 25.1 (23.2–25.6) | 33.4 (32.8–34.6) | 31.9 (31.2–32.6) | +| 2 | 39.1 (34.8–39.7) | 53.9 (44.5–58.5) | 73.3 (69.9–74.9) | 72.6 (31.7–76.2) | 71.3 (64.5–73.8) | 46.5 (45.0–47.9) | 11.2 (10.2–11.4) | 11.1 (9.3–11.2) | +| 4 | 51.8 (46.4–58.2) | 60.0 (56.4–63.8) | 138.9 (134.0–140.5) | 132.8 (94.5–140.5) | 128.0 (91.6–135.7) | 91.9 (89.6–92.2) | 5.7 (5.2–5.8) | 5.6 (4.9–5.6) | +| 8 | 32.9 (25.1–34.9) | 45.6 (44.6–47.2) | 244.6 (212.2–250.5) | 228.8 (197.9–245.1) | 232.2 (149.4–237.3) | 177.2 (172.5–177.6) | 3.9 (3.8–4.1) | 4.1 (4.0–4.1) | ### Mixed, writes=10% @@ -54,10 +54,10 @@ Every read was answered, by every cache. | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 37.6 (34.9–38.4) | **42.5** (40.4–46.5) | 32.9 (30.9–33.2) | 33.4 (31.9–34.6) | 33.1 (32.0–33.6) | 21.7 (21.6–22.2) | 33.5 (31.8–33.9) | 31.4 (31.2–32.0) | -| 2 | 38.9 (37.8–39.6) | 57.7 (55.1–58.7) | 50.0 (31.8–51.7) | 55.2 (53.2–55.8) | 50.6 (30.0–51.8) | 38.0 (36.2–38.8) | 11.7 (11.4–11.8) | 11.8 (11.2–12.0) | -| 4 | 60.7 (59.0–62.2) | 73.7 (57.5–86.8) | 91.4 (78.5–92.7) | 96.5 (92.2–98.5) | 82.2 (78.0–87.4) | 68.4 (52.7–69.5) | 5.9 (5.7–6.3) | 5.9 (5.8–5.9) | -| 8 | 34.0 (31.4–35.4) | 42.8 (42.1–43.3) | 68.6 (64.0–72.8) | 69.9 (67.4–73.2) | 62.6 (55.7–67.6) | **80.8** (80.5–82.0) | 4.4 (4.3–4.6) | 4.5 (4.3–4.5) | +| 1 | 40.3 (38.4–41.4) | 46.4 (36.4–47.9) | 35.7 (6.4–38.2) | 36.6 (12.7–37.4) | 35.3 (34.3–36.0) | 19.7 (17.4–21.5) | 33.3 (32.7–33.6) | 30.9 (28.8–31.2) | +| 2 | 37.6 (35.2–38.5) | 54.5 (25.1–56.2) | 46.1 (14.1–59.3) | 55.3 (25.1–57.5) | 52.9 (45.8–55.3) | 35.6 (31.5–37.8) | 11.1 (9.9–11.2) | 11.1 (10.0–11.5) | +| 4 | 43.6 (39.8–51.9) | 69.2 (17.9–84.8) | 69.1 (24.0–83.4) | 76.5 (38.5–87.2) | 74.4 (50.9–86.5) | 52.4 (37.4–61.9) | 5.6 (5.4–5.7) | 5.6 (4.9–5.6) | +| 8 | 32.4 (25.1–34.7) | 38.9 (17.7–42.3) | 71.6 (36.8–72.5) | 64.2 (48.6–72.8) | 61.4 (51.1–64.1) | 80.3 (52.4–81.7) | 3.8 (3.7–4.2) | 4.1 (3.6–4.4) | ### Mixed, writes=25% @@ -65,10 +65,10 @@ Every read was answered, by every cache. | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 36.2 (34.0–36.5) | **42.0** (37.7–43.5) | 30.0 (28.6–30.9) | 29.1 (27.7–30.9) | 28.4 (26.2–30.6) | 17.4 (16.9–17.5) | 32.8 (32.5–32.9) | 29.6 (29.5–29.9) | -| 2 | 37.9 (36.7–38.4) | **54.0** (52.9–55.6) | 38.7 (38.4–39.0) | 40.4 (39.5–40.6) | 36.5 (36.3–37.0) | 28.7 (28.6–29.1) | 11.7 (11.5–11.8) | 11.6 (11.3–11.7) | -| 4 | 53.6 (48.1–58.1) | **75.6** (64.5–82.4) | 53.9 (52.9–55.0) | 59.8 (56.6–62.8) | 48.7 (46.0–53.7) | 49.5 (41.2–50.2) | 5.8 (5.8–6.3) | 5.9 (5.9–5.9) | -| 8 | 31.3 (30.1–33.5) | 37.6 (36.0–38.6) | 37.2 (35.2–38.4) | 37.0 (33.8–37.5) | 34.6 (34.1–35.3) | **46.6** (46.3–47.7) | 4.4 (4.3–4.4) | 4.4 (4.3–4.5) | +| 1 | 39.2 (35.1–39.4) | 40.7 (38.1–43.6) | 33.0 (29.4–33.2) | 31.9 (30.9–33.3) | 31.4 (30.5–33.4) | 14.1 (12.3–17.4) | 32.5 (30.4–32.7) | 29.7 (27.0–29.8) | +| 2 | 35.1 (26.7–38.5) | 44.7 (34.7–54.4) | 39.5 (28.6–41.9) | 38.5 (34.6–41.9) | 31.7 (19.3–38.6) | 28.1 (14.4–28.7) | 11.0 (10.4–11.6) | 11.2 (10.7–11.5) | +| 4 | 52.9 (22.4–55.2) | 59.1 (26.2–77.4) | 45.9 (22.4–59.7) | 53.9 (23.9–57.9) | 46.6 (20.6–53.9) | 40.4 (27.3–47.4) | 5.7 (5.4–5.8) | 5.6 (5.5–5.7) | +| 8 | 30.6 (22.6–33.4) | 36.9 (28.8–38.2) | 35.7 (27.5–36.3) | 34.9 (33.6–36.7) | 32.9 (32.3–34.5) | **46.5** (43.6–47.2) | 4.0 (3.9–4.1) | 4.1 (4.0–4.3) | ### Evict @@ -76,10 +76,10 @@ Every read was answered, by every cache. | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 16.5 (16.3–16.7) | **16.9** (16.8–17.1) | 13.4 (13.3–13.4) | 8.6 (8.3–8.6) | 8.2 (8.1–8.2) | 3.6 (3.5–3.6) | 7.5 (7.3–7.5) | 3.7 (3.7–3.8) | -| 2 | 22.5 (22.3–22.7) | **23.7** (23.2–23.9) | 14.0 (13.8–14.2) | 11.1 (10.9–11.2) | 10.0 (9.8–10.1) | 6.2 (6.0–6.3) | 6.2 (6.0–6.3) | 3.5 (3.4–3.5) | -| 4 | 36.3 (34.9–36.8) | **37.9** (36.9–38.6) | 18.7 (17.9–18.8) | 15.8 (15.5–16.0) | 14.3 (13.1–14.6) | 6.6 (6.4–6.6) | 4.4 (4.3–4.4) | 3.0 (3.0–3.0) | -| 8 | 31.3 (30.2–31.6) | 30.9 (30.4–31.7) | 12.0 (11.9–12.3) | 10.5 (10.4–10.6) | 9.8 (9.7–10.0) | 5.9 (5.6–6.2) | 3.3 (3.1–3.3) | 2.3 (2.3–2.7) | +| 1 | 17.8 (17.1–18.1) | 16.9 (16.3–17.1) | 14.4 (14.3–14.5) | 9.6 (9.2–9.7) | 8.4 (7.9–8.6) | 3.4 (3.0–3.5) | 7.1 (6.9–7.4) | 3.4 (3.2–3.7) | +| 2 | 24.1 (21.8–24.7) | 22.7 (21.7–23.7) | 14.1 (13.7–14.3) | 11.1 (11.0–11.9) | 10.0 (9.5–10.1) | 5.9 (5.3–6.2) | 5.8 (5.3–6.1) | 3.1 (2.5–3.5) | +| 4 | 37.0 (32.6–38.8) | 33.6 (27.9–38.2) | 18.4 (16.1–19.2) | 15.1 (12.1–16.4) | 13.6 (13.0–14.1) | 6.1 (5.6–6.4) | 4.1 (3.8–4.4) | 2.8 (2.5–3.0) | +| 8 | 31.6 (31.3–33.1) | 30.3 (29.0–31.4) | 12.0 (11.9–12.2) | 10.3 (9.7–10.5) | 9.5 (9.3–9.7) | 5.6 (4.9–5.8) | 3.2 (2.9–3.3) | 2.4 (2.2–2.9) | ### ReadThrough, capacity=16K @@ -87,19 +87,19 @@ Every read was answered, by every cache. | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 30.3 (29.8–30.4) | **31.9** (31.3–32.3) | 28.6 (28.3–28.8) | 22.1 (21.7–22.2) | 21.7 (21.6–21.9) | 12.7 (12.4–12.8) | 16.7 (15.9–16.7) | 10.9 (10.6–11.1) | -| 2 | 34.4 (33.9–35.3) | 35.4 (34.7–35.4) | **42.9** (41.8–43.1) | 35.7 (34.3–36.0) | 34.6 (34.1–34.8) | 19.1 (18.0–19.5) | 8.7 (8.6–8.8) | 6.8 (6.5–6.9) | -| 4 | 54.2 (49.9–54.8) | 55.1 (50.3–56.2) | **72.6** (66.0–73.0) | 62.0 (60.0–62.3) | 59.3 (57.1–59.7) | 39.6 (34.8–41.7) | 4.8 (4.8–4.9) | 4.9 (4.8–4.9) | -| 8 | 34.1 (32.0–38.5) | 33.7 (31.7–36.1) | **53.3** (51.9–53.7) | 43.1 (42.6–43.4) | 46.0 (45.6–46.9) | 23.6 (23.4–24.1) | 3.6 (3.5–3.6) | 3.5 (3.5–3.5) | +| 1 | 31.3 (29.9–31.6) | 30.6 (28.1–31.7) | 31.3 (29.8–31.4) | 23.8 (23.1–24.0) | 22.7 (21.9–23.4) | 10.9 (8.0–12.4) | 16.2 (9.6–16.7) | 9.6 (8.5–10.7) | +| 2 | 34.3 (33.2–35.0) | 34.3 (31.7–34.8) | **43.5** (40.6–45.2) | 37.0 (36.3–37.8) | 33.5 (25.7–35.7) | 15.3 (10.7–19.1) | 8.0 (4.6–8.5) | 6.3 (5.7–6.6) | +| 4 | 51.2 (45.9–53.3) | 44.0 (39.7–48.5) | 69.0 (48.6–74.0) | 58.8 (51.4–60.8) | 50.4 (18.1–58.7) | 24.9 (16.0–36.0) | 4.7 (4.3–4.9) | 4.8 (4.5–4.8) | +| 8 | 35.3 (31.3–36.0) | 35.9 (34.4–37.0) | **55.1** (54.0–56.6) | 42.2 (41.0–43.3) | 46.0 (27.7–46.9) | 22.8 (14.3–23.4) | 3.4 (3.0–3.6) | 3.3 (2.4–3.7) | Share of the reads that were answered, in percent: | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 84.0 | 85.6 | 87.7 | 86.8 | 88.0 | 87.1 | 84.0 | 85.3 | -| 2 | 84.0 | 85.6 | 87.8 | 86.8 | 88.0 | 86.9 | 84.0 | 85.3 | -| 4 | 84.0 | 85.6 | 87.8 | 86.8 | 88.0 | 87.5 | 84.0 | 85.3 | -| 8 | 84.0 | 85.5 | 87.7 | 86.8 | 88.0 | 87.6 | 84.0 | 85.3 | +| 1 | 84.0 | 85.6 | 87.8 | 86.8 | 88.0 | 87.0 | 84.0 | 85.3 | +| 2 | 84.0 | 85.6 | 87.8 | 86.8 | 88.0 | 86.6 | 84.0 | 85.3 | +| 4 | 84.0 | 85.6 | 87.8 | 86.8 | 88.0 | 87.7 | 84.0 | 85.3 | +| 8 | 84.0 | 85.5 | 87.7 | 86.8 | 88.0 | 87.5 | 84.0 | 85.3 | ### ReadThrough, capacity=1M @@ -107,16 +107,16 @@ Share of the reads that were answered, in percent: | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 8.8 (8.4–9.1) | 8.4 (7.9–8.5) | 8.9 (8.0–9.1) | 7.2 (6.7–7.4) | 7.5 (7.0–7.5) | 4.3 (4.2–4.7) | 6.3 (6.2–6.4) | 4.3 (4.0–4.4) | -| 2 | 13.5 (12.1–13.6) | 11.3 (10.8–11.8) | **15.7** (14.0–15.8) | 12.1 (11.6–13.1) | 12.9 (12.5–13.6) | 8.9 (8.4–9.3) | 3.6 (3.3–3.7) | 2.9 (2.7–2.9) | -| 4 | 21.6 (19.4–22.1) | 18.1 (17.1–18.5) | **27.1** (25.4–28.0) | 21.4 (20.0–22.9) | 23.2 (19.3–24.1) | 15.8 (14.4–16.1) | 3.1 (2.9–3.2) | 2.5 (2.4–2.6) | -| 8 | 30.1 (28.5–30.3) | 28.7 (28.2–29.1) | **41.5** (41.2–42.3) | 36.8 (36.3–37.0) | 37.8 (37.0–38.2) | 17.9 (17.4–18.7) | 2.9 (2.8–3.0) | 2.4 (2.3–2.4) | +| 1 | 7.2 (6.2–8.3) | 7.6 (6.4–7.9) | 7.3 (4.8–8.1) | 6.8 (5.7–7.1) | 6.8 (4.6–7.3) | 4.0 (3.4–4.3) | 5.9 (4.6–6.2) | 4.1 (3.7–4.3) | +| 2 | 11.0 (5.3–11.3) | 9.9 (7.9–10.3) | 13.3 (11.2–14.8) | 11.9 (8.4–12.5) | 11.1 (8.8–12.7) | 8.5 (7.3–9.2) | 3.0 (2.8–3.6) | 2.6 (2.5–2.8) | +| 4 | 17.0 (8.1–17.4) | 14.0 (9.5–16.8) | 20.1 (18.6–24.7) | 19.1 (16.5–20.9) | 19.2 (16.6–20.6) | 13.0 (12.7–14.2) | 2.9 (2.3–3.0) | 2.4 (2.3–2.5) | +| 8 | 28.6 (18.1–29.2) | 27.3 (15.9–28.3) | **41.1** (40.1–42.2) | 35.5 (34.4–36.2) | 37.3 (33.4–38.1) | 17.2 (17.0–17.5) | 2.7 (2.6–2.9) | 2.3 (2.2–2.5) | Share of the reads that were answered, in percent: | CPUs | evict/lru | evict/twoq | evict/sieve | evict/s3fifo | evict/tinylfu | otter | golang-lru | golang-lru/2q | |---:|---:|---:|---:|---:|---:|---:|---:|---:| -| 1 | 88.4 | 89.0 | 89.7 | 89.9 | 89.9 | 89.6 | 88.4 | 89.4 | -| 2 | 88.4 | 89.1 | 89.9 | 90.0 | 90.0 | 89.7 | 88.4 | 89.4 | -| 4 | 88.4 | 89.3 | 90.0 | 90.1 | 90.2 | 89.8 | 88.4 | 89.4 | +| 1 | 88.5 | 88.9 | 89.7 | 89.8 | 89.9 | 89.6 | 88.4 | 89.4 | +| 2 | 88.4 | 89.0 | 89.8 | 89.9 | 90.0 | 89.6 | 88.4 | 89.4 | +| 4 | 88.4 | 89.2 | 90.0 | 90.0 | 90.1 | 89.8 | 88.4 | 89.4 | | 8 | 88.4 | 89.4 | 90.1 | 90.2 | 90.4 | 89.8 | 88.4 | 89.4 | diff --git a/bench/results/throughput.txt b/bench/results/throughput.txt index 838b314..acf6d82 100644 --- a/bench/results/throughput.txt +++ b/bench/results/throughput.txt @@ -5,264 +5,264 @@ goos: darwin goarch: arm64 pkg: github.com/floatdrop/evict/bench cpu: Apple M3 Max -BenchmarkGet/cache=evict/lru 46666327 25.58 ns/op 39.10 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-2 48099726 24.95 ns/op 40.08 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-4 71890544 16.21 ns/op 61.68 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-8 42586539 27.88 ns/op 35.87 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq 60835604 19.71 ns/op 50.74 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-2 73391312 16.51 ns/op 60.59 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-4 95281258 12.10 ns/op 82.67 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-8 54309907 22.51 ns/op 44.42 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve 43051128 28.10 ns/op 35.59 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-2 78179078 15.56 ns/op 64.27 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-4 148293733 7.874 ns/op 127.0 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-8 343566361 3.475 ns/op 287.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo 41409831 29.05 ns/op 34.42 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-2 86098906 13.91 ns/op 71.88 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-4 161028606 7.225 ns/op 138.4 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-8 342543387 3.500 ns/op 285.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu 41573738 28.80 ns/op 34.72 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-2 83530318 14.39 ns/op 69.48 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-4 161429149 7.265 ns/op 137.6 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-8 330364904 3.650 ns/op 274.0 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter 32888463 36.52 ns/op 27.38 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-2 60800797 19.65 ns/op 50.90 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-4 124868935 9.689 ns/op 103.2 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-8 244888567 4.882 ns/op 204.8 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru 40158626 30.08 ns/op 33.25 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-2 14206374 84.19 ns/op 11.88 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-4 7074715 170.6 ns/op 5.861 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-8 5462608 223.4 ns/op 4.476 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q 40491464 29.74 ns/op 33.63 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-2 14147119 84.28 ns/op 11.87 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-4 7197310 168.7 ns/op 5.927 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-8 5504938 221.8 ns/op 4.509 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru 43847228 27.78 ns/op 36.00 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-2 44901495 26.60 ns/op 37.59 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-4 53756313 20.58 ns/op 48.60 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-8 29932776 40.87 ns/op 24.47 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq 54033973 22.24 ns/op 44.96 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-2 55338640 21.89 ns/op 45.68 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-4 73150659 16.37 ns/op 61.07 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-8 34064013 35.53 ns/op 28.15 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve 26771497 44.63 ns/op 22.41 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-2 22565456 53.24 ns/op 18.78 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-4 25197004 47.69 ns/op 20.97 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-8 16693609 72.73 ns/op 13.75 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo 27474151 43.72 ns/op 22.87 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-2 23565086 50.84 ns/op 19.67 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-4 27113332 44.19 ns/op 22.63 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-8 16841542 71.22 ns/op 14.04 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu 25516328 46.87 ns/op 21.33 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-2 20847674 57.77 ns/op 17.31 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-4 22520566 53.15 ns/op 18.81 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-8 15783788 78.41 ns/op 12.75 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=otter 10765143 112.4 ns/op 8.897 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-2 17038414 69.77 ns/op 14.33 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-4 26918780 45.07 ns/op 22.19 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-8 19262281 62.37 ns/op 16.03 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=golang-lru 39672372 30.27 ns/op 33.04 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-2 14012839 86.09 ns/op 11.62 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-4 6780300 171.2 ns/op 5.842 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-8 5447508 224.3 ns/op 4.458 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q 31749775 37.92 ns/op 26.37 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-2 13054628 93.82 ns/op 10.66 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-4 6813547 180.5 ns/op 5.539 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-8 5054456 232.9 ns/op 4.293 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru 40921413 29.40 ns/op 34.02 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-2 47907618 25.02 ns/op 39.97 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-4 73021015 16.30 ns/op 61.37 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-8 41211798 28.89 ns/op 34.62 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq 58704344 20.45 ns/op 48.89 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-2 71895752 16.59 ns/op 60.29 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-4 91257063 14.02 ns/op 71.35 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-8 49306203 23.43 ns/op 42.67 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve 41958958 28.46 ns/op 35.13 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-2 81969312 14.64 ns/op 68.30 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-4 155121722 7.812 ns/op 128.0 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-8 223458138 5.370 ns/op 186.2 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo 43857444 27.45 ns/op 36.43 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 77276641 15.51 ns/op 64.49 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 100000000 10.73 ns/op 93.16 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 268969392 4.465 ns/op 224.0 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu 42437440 28.24 ns/op 35.41 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 80195366 14.96 ns/op 66.87 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 149046898 8.107 ns/op 123.4 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 202719595 5.909 ns/op 169.2 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter 31994560 38.11 ns/op 26.24 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-2 56398707 21.44 ns/op 46.63 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-4 100000000 10.67 ns/op 93.75 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-8 208926303 5.717 ns/op 174.9 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru 38863879 32.76 ns/op 30.52 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-2 14102665 85.00 ns/op 11.76 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-4 7161741 168.9 ns/op 5.922 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-8 5430728 236.5 ns/op 4.228 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q 40287157 30.10 ns/op 33.22 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 14409040 83.37 ns/op 11.99 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 7234738 167.6 ns/op 5.967 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 5452029 224.3 ns/op 4.459 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru 42068236 28.56 ns/op 35.01 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-2 45578058 26.43 ns/op 37.84 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-4 73575621 16.41 ns/op 60.95 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-8 40856452 29.86 ns/op 33.49 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq 48813972 24.76 ns/op 40.39 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-2 70151680 17.02 ns/op 58.74 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-4 93120676 13.57 ns/op 73.68 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-8 50462221 23.73 ns/op 42.13 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve 39569516 30.38 ns/op 32.92 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-2 61857397 19.35 ns/op 51.68 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-4 100000000 10.94 ns/op 91.37 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-8 83329716 13.74 ns/op 72.80 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo 41202658 28.87 ns/op 34.64 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 67395223 17.92 ns/op 55.79 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 100000000 10.17 ns/op 98.30 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 81875169 14.83 ns/op 67.43 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu 40036032 29.76 ns/op 33.61 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 60392551 19.90 ns/op 50.25 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 100000000 11.45 ns/op 87.37 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 79737307 14.79 ns/op 67.61 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter 27472134 45.01 ns/op 22.21 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-2 47253782 25.75 ns/op 38.83 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-4 85411021 14.39 ns/op 69.51 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-8 94271067 12.25 ns/op 81.60 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru 40037868 29.93 ns/op 33.41 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-2 13908769 85.47 ns/op 11.70 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-4 7058296 174.9 ns/op 5.717 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-8 5069361 233.5 ns/op 4.283 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q 38513536 31.26 ns/op 31.99 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 14206863 85.13 ns/op 11.75 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 6934458 170.3 ns/op 5.873 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 5509556 231.0 ns/op 4.328 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru 42409008 28.27 ns/op 35.38 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-2 46158062 26.05 ns/op 38.38 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-4 57342988 20.80 ns/op 48.07 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-8 39657404 29.89 ns/op 33.46 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq 50679064 23.30 ns/op 42.91 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-2 64630650 18.54 ns/op 53.95 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-4 95676612 12.74 ns/op 78.51 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-8 46416949 25.90 ns/op 38.61 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve 37200602 32.35 ns/op 30.91 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-2 46566902 26.04 ns/op 38.40 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-4 63614354 18.58 ns/op 53.82 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-8 44135766 26.04 ns/op 38.41 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo 37117705 32.35 ns/op 30.92 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 49033045 24.63 ns/op 40.60 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 73075118 16.12 ns/op 62.02 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 43697406 27.79 ns/op 35.99 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu 35731212 33.51 ns/op 29.84 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 44075919 27.27 ns/op 36.67 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 56315001 20.55 ns/op 48.66 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 42642028 28.31 ns/op 35.33 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter 18690084 57.13 ns/op 17.50 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-2 34941067 34.51 ns/op 28.97 Mops/s 3 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-4 60221439 19.97 ns/op 50.08 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-8 55050183 21.44 ns/op 46.64 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru 39515984 30.48 ns/op 32.81 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-2 13971466 85.79 ns/op 11.66 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-4 7032380 171.8 ns/op 5.819 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-8 5055351 235.0 ns/op 4.255 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q 36127303 33.48 ns/op 29.87 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 14036920 85.79 ns/op 11.66 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 7095694 170.3 ns/op 5.873 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 5361331 227.0 ns/op 4.405 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru 19948106 59.94 ns/op 16.68 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-2 27178759 44.51 ns/op 22.47 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-4 44025657 27.17 ns/op 36.81 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-8 37344979 31.71 ns/op 31.54 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq 20440071 58.42 ns/op 17.12 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-2 28334352 42.11 ns/op 23.75 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-4 44832996 27.02 ns/op 37.01 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-8 37783077 32.34 ns/op 30.92 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve 16223632 74.36 ns/op 13.45 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-2 17047573 71.47 ns/op 13.99 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-4 22472190 53.10 ns/op 18.83 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-8 14717086 81.24 ns/op 12.31 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo 10354758 116.1 ns/op 8.613 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-2 13425121 89.62 ns/op 11.16 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-4 19333957 62.77 ns/op 15.93 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-8 12630182 95.72 ns/op 10.45 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu 9841210 122.2 ns/op 8.182 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-2 12045960 98.69 ns/op 10.13 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-4 17332148 68.65 ns/op 14.57 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-8 11931241 100.2 ns/op 9.984 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=otter 4519437 276.5 ns/op 3.617 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-2 7709026 159.4 ns/op 6.275 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-4 8360912 150.7 ns/op 6.634 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-8 7367139 178.0 ns/op 5.620 Mops/s 103 B/op 2 allocs/op -BenchmarkEvict/cache=golang-lru 9018136 133.6 ns/op 7.483 Mops/s 72 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-2 7372458 160.0 ns/op 6.249 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-4 5281910 230.5 ns/op 4.339 Mops/s 72 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-8 3653846 326.7 ns/op 3.061 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru/2q 4732399 266.5 ns/op 3.753 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-2 4540872 282.3 ns/op 3.543 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-4 3927514 328.6 ns/op 3.043 Mops/s 123 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-8 3459385 365.4 ns/op 2.737 Mops/s 123 B/op 1 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru 36366345 32.90 ns/op 30.40 Mops/s 83.98 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 40717533 29.54 ns/op 33.85 Mops/s 83.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 66666822 20.05 ns/op 49.87 Mops/s 83.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 40254272 30.07 ns/op 33.25 Mops/s 83.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq 38548023 31.17 ns/op 32.08 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 42373692 28.26 ns/op 35.39 Mops/s 85.57 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 65780457 18.16 ns/op 55.07 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 39028832 31.50 ns/op 31.74 Mops/s 85.53 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve 33111858 34.92 ns/op 28.63 Mops/s 87.71 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 50188117 23.19 ns/op 43.12 Mops/s 87.84 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 83973584 13.70 ns/op 73.01 Mops/s 87.83 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 57662275 18.78 ns/op 53.26 Mops/s 87.71 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 25038644 45.06 ns/op 22.19 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 42458400 27.90 ns/op 35.84 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 74019435 16.13 ns/op 62.00 Mops/s 86.76 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 51795114 23.05 ns/op 43.38 Mops/s 86.79 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 25881218 45.98 ns/op 21.75 Mops/s 88.06 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 41005546 28.90 ns/op 34.60 Mops/s 88.05 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 70359392 16.87 ns/op 59.28 Mops/s 88.05 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 54393808 21.74 ns/op 46.00 Mops/s 88.02 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter 15361154 78.21 ns/op 12.79 Mops/s 87.08 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-2 23457162 51.34 ns/op 19.48 Mops/s 87.19 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-4 49281736 25.28 ns/op 39.56 Mops/s 87.43 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-8 26832356 41.53 ns/op 24.08 Mops/s 87.61 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru 19503208 60.47 ns/op 16.54 Mops/s 83.96 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 10778176 115.0 ns/op 8.695 Mops/s 83.96 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 5888361 204.9 ns/op 4.881 Mops/s 83.96 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 4293045 275.9 ns/op 3.624 Mops/s 83.98 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 12567182 90.02 ns/op 11.11 Mops/s 85.25 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 8344867 146.2 ns/op 6.838 Mops/s 85.27 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 6038539 204.7 ns/op 4.886 Mops/s 85.27 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 4108848 288.6 ns/op 3.465 Mops/s 85.32 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru 10741434 110.7 ns/op 9.032 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 15770209 73.46 ns/op 13.61 Mops/s 88.43 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 26986202 46.41 ns/op 21.55 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 35418428 33.16 ns/op 30.16 Mops/s 88.43 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq 10026228 118.7 ns/op 8.425 Mops/s 88.94 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 14945331 87.82 ns/op 11.39 Mops/s 89.11 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 23910871 53.93 ns/op 18.54 Mops/s 89.30 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 36088732 34.86 ns/op 28.69 Mops/s 89.39 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve 9702633 110.1 ns/op 9.081 Mops/s 89.73 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 18330393 63.15 ns/op 15.84 Mops/s 89.86 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 32584272 36.14 ns/op 27.67 Mops/s 90.01 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 45628098 24.11 ns/op 41.48 Mops/s 90.10 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 8539357 135.8 ns/op 7.365 Mops/s 89.86 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 15116348 76.63 ns/op 13.05 Mops/s 89.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 28991254 43.75 ns/op 22.85 Mops/s 90.09 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 43700589 27.02 ns/op 37.01 Mops/s 90.18 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 7621386 134.1 ns/op 7.457 Mops/s 89.84 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 16054818 79.95 ns/op 12.51 Mops/s 90.03 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 29615643 41.40 ns/op 24.15 Mops/s 90.24 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 41731872 27.03 ns/op 37.00 Mops/s 90.38 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter 4681652 234.1 ns/op 4.271 Mops/s 89.54 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-2 10478510 107.6 ns/op 9.294 Mops/s 89.66 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-4 17758002 62.24 ns/op 16.07 Mops/s 89.78 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-8 20279332 55.53 ns/op 18.01 Mops/s 89.85 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru 7315104 157.5 ns/op 6.351 Mops/s 88.43 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 4385940 271.0 ns/op 3.691 Mops/s 88.42 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 3816247 327.1 ns/op 3.057 Mops/s 88.44 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3250658 350.0 ns/op 2.857 Mops/s 88.43 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 5316012 226.0 ns/op 4.425 Mops/s 89.43 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 3610468 350.0 ns/op 2.857 Mops/s 89.44 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 3103783 391.1 ns/op 2.557 Mops/s 89.42 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2788053 414.4 ns/op 2.413 Mops/s 89.43 hit% 17 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru 45669848 25.12 ns/op 39.80 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-2 41109792 31.20 ns/op 32.05 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-4 51157708 23.52 ns/op 42.52 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-8 37517487 31.13 ns/op 32.13 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq 56935221 21.15 ns/op 47.29 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-2 67586911 17.43 ns/op 57.36 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-4 100000000 11.40 ns/op 87.71 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-8 54218704 22.26 ns/op 44.93 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve 49196289 24.94 ns/op 40.10 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-2 96080391 12.39 ns/op 80.73 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-4 185952681 6.421 ns/op 155.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-8 362806443 3.295 ns/op 303.5 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo 47001453 28.99 ns/op 34.49 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-2 91395780 15.68 ns/op 63.78 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-4 102096646 9.839 ns/op 101.6 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-8 231110414 14.32 ns/op 69.83 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu 10986650 148.1 ns/op 6.753 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-2 79619598 72.35 ns/op 13.82 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-4 100000000 32.76 ns/op 30.53 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-8 100000000 16.84 ns/op 59.39 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter 7198971 151.6 ns/op 6.597 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-2 30659238 60.23 ns/op 16.60 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-4 86606642 15.78 ns/op 63.38 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-8 174937260 6.404 ns/op 156.2 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru 37864892 32.17 ns/op 31.09 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-2 9479742 108.8 ns/op 9.191 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-4 5862604 207.8 ns/op 4.813 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-8 3731224 281.2 ns/op 3.556 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q 32964277 33.45 ns/op 29.90 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-2 11068362 114.4 ns/op 8.745 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-4 6310312 184.4 ns/op 5.422 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-8 5043853 232.9 ns/op 4.293 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru 44639535 29.34 ns/op 34.08 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-2 38929687 27.77 ns/op 36.01 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-4 53568837 24.48 ns/op 40.84 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-8 29130337 41.55 ns/op 24.07 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq 53930868 22.68 ns/op 44.09 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-2 54846799 22.13 ns/op 45.18 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-4 81103000 19.46 ns/op 51.37 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-8 33604540 36.04 ns/op 27.75 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve 26541846 45.50 ns/op 21.98 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-2 21243214 60.19 ns/op 16.61 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-4 20240112 56.81 ns/op 17.60 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-8 14029610 84.37 ns/op 11.85 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo 27333865 44.06 ns/op 22.70 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-2 21539247 55.09 ns/op 18.15 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-4 21102240 64.21 ns/op 15.57 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-8 13447329 79.25 ns/op 12.62 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu 28308757 44.39 ns/op 22.53 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-2 18239079 60.62 ns/op 16.50 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-4 17810540 64.37 ns/op 15.54 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-8 13505553 84.63 ns/op 11.82 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=otter 9523231 123.6 ns/op 8.093 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-2 16523131 76.84 ns/op 13.01 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-4 21553384 58.98 ns/op 16.96 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-8 18315856 65.33 ns/op 15.31 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=golang-lru 38620030 30.68 ns/op 32.59 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-2 13292286 93.78 ns/op 10.66 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-4 6645284 183.9 ns/op 5.437 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-8 4540008 252.1 ns/op 3.967 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q 32620070 38.23 ns/op 26.16 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-2 11401234 100.1 ns/op 9.989 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-4 6497164 205.0 ns/op 4.879 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-8 4371212 278.8 ns/op 3.587 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru 43680110 26.20 ns/op 38.17 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-2 47263011 25.78 ns/op 38.79 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-4 58406594 21.58 ns/op 46.35 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-8 33441398 39.93 ns/op 25.05 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq 59682562 21.76 ns/op 45.96 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-2 61659141 21.74 ns/op 45.99 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-4 58061120 17.74 ns/op 56.36 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-8 54885369 22.20 ns/op 45.05 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve 48953532 25.40 ns/op 39.37 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-2 92847816 13.64 ns/op 73.31 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-4 157527216 7.117 ns/op 140.5 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-8 296423342 4.089 ns/op 244.6 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo 43153243 24.04 ns/op 41.60 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 83933938 14.08 ns/op 71.04 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 161348631 7.119 ns/op 140.5 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 275684220 4.371 ns/op 228.8 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu 49671444 27.26 ns/op 36.68 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 79685464 15.50 ns/op 64.52 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 158557426 7.995 ns/op 125.1 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 269107722 4.306 ns/op 232.2 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter 25581784 39.77 ns/op 25.14 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-2 52401554 21.84 ns/op 45.80 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-4 100000000 10.84 ns/op 92.21 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-8 210947685 5.652 ns/op 176.9 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru 41608094 28.90 ns/op 34.60 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-2 13746360 88.76 ns/op 11.27 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-4 7124379 174.2 ns/op 5.740 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-8 4810232 255.3 ns/op 3.916 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q 39265248 30.92 ns/op 32.34 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 13471521 107.5 ns/op 9.300 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 6414099 203.6 ns/op 4.911 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 4551757 250.3 ns/op 3.996 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru 50245470 24.33 ns/op 41.10 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-2 45823388 26.72 ns/op 37.43 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-4 54995619 19.28 ns/op 51.87 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-8 42132981 28.82 ns/op 34.70 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq 58474544 21.53 ns/op 46.44 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-2 72002340 18.02 ns/op 55.48 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-4 89787871 14.44 ns/op 69.24 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-8 51253210 23.62 ns/op 42.33 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve 46260748 26.17 ns/op 38.22 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-2 69210139 17.96 ns/op 55.67 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-4 100000000 12.00 ns/op 83.37 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-8 84809902 13.79 ns/op 72.51 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo 41266716 27.24 ns/op 36.71 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 70398952 17.37 ns/op 57.55 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 100000000 11.47 ns/op 87.20 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 79304540 15.24 ns/op 65.62 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu 43316085 27.74 ns/op 36.04 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 59216611 18.09 ns/op 55.28 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 95897703 13.44 ns/op 74.40 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 76240900 15.60 ns/op 64.10 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter 26686557 47.43 ns/op 21.08 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-2 46847246 26.45 ns/op 37.81 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-4 62706162 19.10 ns/op 52.37 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-8 94981170 12.46 ns/op 80.27 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru 41069107 29.80 ns/op 33.56 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-2 13367910 90.25 ns/op 11.08 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-4 6680006 175.4 ns/op 5.700 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-8 4794801 259.9 ns/op 3.848 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q 34057005 32.39 ns/op 30.88 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 13576062 89.79 ns/op 11.14 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 6789366 177.2 ns/op 5.643 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 5022813 245.8 ns/op 4.069 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru 45785725 25.39 ns/op 39.39 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-2 43945780 29.57 ns/op 33.82 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-4 68517918 18.41 ns/op 54.31 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-8 38487442 31.33 ns/op 31.92 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq 55780765 22.92 ns/op 43.64 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-2 64264198 22.73 ns/op 44.00 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-4 77442462 18.04 ns/op 55.44 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-8 45308450 26.80 ns/op 37.32 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve 40342066 30.10 ns/op 33.23 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-2 29207176 34.97 ns/op 28.59 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-4 54861009 21.79 ns/op 45.88 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-8 39130753 27.96 ns/op 35.77 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo 39887649 32.33 ns/op 30.93 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 48084547 25.96 ns/op 38.52 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 71721004 18.42 ns/op 54.30 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 39722712 29.72 ns/op 33.65 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu 40412148 31.61 ns/op 31.64 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 31935985 32.85 ns/op 30.44 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 58800950 26.90 ns/op 37.18 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 39895993 30.95 ns/op 32.31 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter 17139816 81.34 ns/op 12.29 Mops/s 3 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-2 16858855 69.44 ns/op 14.40 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-4 28117612 36.64 ns/op 27.29 Mops/s 3 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-8 51176253 22.95 ns/op 43.57 Mops/s 3 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru 35891964 32.95 ns/op 30.35 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-2 12384321 92.12 ns/op 10.86 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-4 6124554 184.1 ns/op 5.433 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-8 4546022 254.5 ns/op 3.929 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q 35580681 33.66 ns/op 29.71 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 13655851 89.38 ns/op 11.19 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 6394610 183.0 ns/op 5.464 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 4855201 248.4 ns/op 4.025 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru 19435886 58.66 ns/op 17.05 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-2 26686336 43.16 ns/op 23.17 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-4 43526755 30.62 ns/op 32.65 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-8 36917254 31.16 ns/op 32.09 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq 20073518 59.32 ns/op 16.86 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-2 28761946 46.13 ns/op 21.68 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-4 32943538 32.87 ns/op 30.42 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-8 35333997 33.29 ns/op 30.04 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve 17487697 69.81 ns/op 14.32 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-2 17452471 71.04 ns/op 14.08 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-4 22417474 54.17 ns/op 18.46 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-8 14537428 81.88 ns/op 12.21 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo 11595523 104.2 ns/op 9.598 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-2 13959256 89.78 ns/op 11.14 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-4 15085791 68.73 ns/op 14.55 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-8 12217827 96.63 ns/op 10.35 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu 9467554 124.1 ns/op 8.060 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-2 10531981 101.7 ns/op 9.832 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-4 16853833 74.57 ns/op 13.41 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-8 11649466 105.8 ns/op 9.447 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=otter 4385194 289.8 ns/op 3.451 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=otter-2 7487682 188.1 ns/op 5.315 Mops/s 102 B/op 2 allocs/op +BenchmarkEvict/cache=otter-4 7936682 165.0 ns/op 6.060 Mops/s 104 B/op 2 allocs/op +BenchmarkEvict/cache=otter-8 6282182 173.1 ns/op 5.778 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=golang-lru 9006807 141.7 ns/op 7.055 Mops/s 72 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-2 6679479 172.7 ns/op 5.789 Mops/s 72 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-4 4742287 264.8 ns/op 3.776 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-8 3686272 333.2 ns/op 3.002 Mops/s 72 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru/2q 4322194 316.8 ns/op 3.156 Mops/s 122 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-2 4082427 397.5 ns/op 2.516 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-4 3022285 408.1 ns/op 2.450 Mops/s 122 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-8 2847781 416.5 ns/op 2.401 Mops/s 123 B/op 1 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru 37404296 33.45 ns/op 29.90 Mops/s 83.98 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 40241841 30.12 ns/op 33.20 Mops/s 83.97 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 66690285 21.08 ns/op 47.43 Mops/s 83.96 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 41140153 28.33 ns/op 35.30 Mops/s 83.97 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq 38079824 32.08 ns/op 31.17 Mops/s 85.57 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 40120136 29.14 ns/op 34.32 Mops/s 85.57 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 56178238 20.64 ns/op 48.45 Mops/s 85.56 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 43469598 28.56 ns/op 35.02 Mops/s 85.54 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve 36524212 32.49 ns/op 30.78 Mops/s 87.76 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 43770327 23.17 ns/op 43.15 Mops/s 87.81 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 73789578 14.50 ns/op 68.98 Mops/s 87.80 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 65048438 18.21 ns/op 54.91 Mops/s 87.72 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 28018670 42.53 ns/op 23.51 Mops/s 86.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 44206628 27.26 ns/op 36.68 Mops/s 86.76 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 74890780 17.01 ns/op 58.78 Mops/s 86.78 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 47914074 24.39 ns/op 41.01 Mops/s 86.78 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 26528155 45.76 ns/op 21.85 Mops/s 88.06 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 38536934 32.21 ns/op 31.04 Mops/s 88.05 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 25238671 46.18 ns/op 21.66 Mops/s 88.02 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 44122072 30.91 ns/op 32.36 Mops/s 88.04 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter 13751006 91.42 ns/op 10.94 Mops/s 87.04 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-2 20341640 92.02 ns/op 10.87 Mops/s 86.54 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-4 28889557 60.24 ns/op 16.60 Mops/s 87.17 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-8 17254662 63.29 ns/op 15.80 Mops/s 87.52 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru 16205576 104.4 ns/op 9.576 Mops/s 83.97 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 5840960 215.3 ns/op 4.644 Mops/s 83.97 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 4699126 230.6 ns/op 4.336 Mops/s 83.95 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 3481316 337.8 ns/op 2.960 Mops/s 83.98 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 11645209 104.2 ns/op 9.598 Mops/s 85.27 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 7897520 157.4 ns/op 6.353 Mops/s 85.28 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 5957452 207.2 ns/op 4.826 Mops/s 85.29 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 3756154 411.9 ns/op 2.428 Mops/s 85.32 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru 7410841 162.5 ns/op 6.153 Mops/s 88.45 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 9328864 188.0 ns/op 5.320 Mops/s 88.42 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 9181520 122.8 ns/op 8.142 Mops/s 88.45 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 24292275 55.31 ns/op 18.08 Mops/s 88.43 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq 6774002 155.4 ns/op 6.435 Mops/s 88.80 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 9634765 127.3 ns/op 7.855 Mops/s 88.93 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 11906592 104.7 ns/op 9.547 Mops/s 89.02 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 18423568 62.99 ns/op 15.88 Mops/s 89.21 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve 6363988 209.3 ns/op 4.777 Mops/s 89.67 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 14580904 89.25 ns/op 11.20 Mops/s 89.81 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 20916308 53.61 ns/op 18.65 Mops/s 89.89 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 42319521 24.96 ns/op 40.07 Mops/s 90.08 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 7672063 157.3 ns/op 6.357 Mops/s 89.85 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 14503153 82.92 ns/op 12.06 Mops/s 89.95 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 21872497 55.29 ns/op 18.09 Mops/s 90.03 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 42203923 28.17 ns/op 35.50 Mops/s 90.17 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 7481329 156.0 ns/op 6.411 Mops/s 89.87 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 12451011 90.42 ns/op 11.06 Mops/s 89.97 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 22141395 56.47 ns/op 17.71 Mops/s 90.14 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 41597276 27.22 ns/op 36.74 Mops/s 90.38 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter 4107704 268.0 ns/op 3.731 Mops/s 89.57 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-2 8815380 123.1 ns/op 8.122 Mops/s 89.57 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-4 15869377 77.75 ns/op 12.86 Mops/s 89.73 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-8 18922171 58.85 ns/op 16.99 Mops/s 89.80 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru 7503528 170.5 ns/op 5.864 Mops/s 88.45 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 3095050 361.3 ns/op 2.768 Mops/s 88.42 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 3554871 342.9 ns/op 2.916 Mops/s 88.44 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3019719 374.1 ns/op 2.673 Mops/s 88.42 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 5128920 244.9 ns/op 4.083 Mops/s 89.44 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 3261373 382.6 ns/op 2.614 Mops/s 89.41 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 2849955 440.7 ns/op 2.269 Mops/s 89.40 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2497396 433.3 ns/op 2.308 Mops/s 89.45 hit% 17 B/op 0 allocs/op PASS -ok github.com/floatdrop/evict/bench 438.461s +ok github.com/floatdrop/evict/bench 487.775s go: go1.27.3 golang-lru: v2.0.7 otter: v2.4.0 @@ -270,264 +270,264 @@ goos: darwin goarch: arm64 pkg: github.com/floatdrop/evict/bench cpu: Apple M3 Max -BenchmarkGet/cache=evict/lru 48198901 24.96 ns/op 40.06 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-2 47642601 25.23 ns/op 39.64 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-4 75306913 18.07 ns/op 55.33 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-8 40387438 28.93 ns/op 34.56 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq 57285729 20.90 ns/op 47.86 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-2 74650077 16.19 ns/op 61.77 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-4 100000000 11.05 ns/op 90.51 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-8 56135643 21.00 ns/op 47.62 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve 42985522 27.99 ns/op 35.73 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-2 81014479 14.31 ns/op 69.86 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-4 170889384 6.947 ns/op 143.9 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-8 303307148 3.960 ns/op 252.5 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo 43698334 27.52 ns/op 36.34 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-2 87294686 13.76 ns/op 72.67 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-4 100000000 10.15 ns/op 98.51 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-8 282303343 3.640 ns/op 274.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu 41988321 28.58 ns/op 34.99 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-2 76872774 15.52 ns/op 64.43 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-4 164120050 7.258 ns/op 137.8 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-8 325939375 3.685 ns/op 271.4 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter 32850123 36.43 ns/op 27.45 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-2 58160784 20.61 ns/op 48.53 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-4 100000000 10.10 ns/op 99.02 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-8 239019303 5.017 ns/op 199.3 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru 42002344 28.57 ns/op 35.00 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-2 14052741 86.14 ns/op 11.61 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-4 7135638 170.2 ns/op 5.876 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-8 5107741 236.3 ns/op 4.231 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q 40292229 29.86 ns/op 33.49 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-2 14182642 83.94 ns/op 11.91 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-4 7114629 168.8 ns/op 5.923 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-8 5170392 230.1 ns/op 4.346 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru 45333270 26.36 ns/op 37.94 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-2 43620897 27.18 ns/op 36.80 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-4 56100763 21.53 ns/op 46.44 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-8 31977615 38.20 ns/op 26.18 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq 46558772 25.79 ns/op 38.78 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-2 53885660 22.38 ns/op 44.68 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-4 74598255 16.09 ns/op 62.16 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-8 34892848 35.16 ns/op 28.44 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve 26526908 45.36 ns/op 22.05 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-2 22549573 53.17 ns/op 18.81 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-4 21736783 55.25 ns/op 18.10 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-8 17282028 72.52 ns/op 13.79 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo 27032607 44.48 ns/op 22.48 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-2 23036866 51.94 ns/op 19.25 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-4 24224989 49.72 ns/op 20.11 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-8 16482562 72.28 ns/op 13.83 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu 27570255 43.79 ns/op 22.84 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-2 20580232 57.39 ns/op 17.42 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-4 21650456 55.65 ns/op 17.97 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-8 15726454 77.49 ns/op 12.90 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=otter 10676428 112.5 ns/op 8.887 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-2 16744254 70.39 ns/op 14.21 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-4 26564564 44.76 ns/op 22.34 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-8 18997461 62.78 ns/op 15.93 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=golang-lru 39246361 30.51 ns/op 32.77 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-2 13487887 87.53 ns/op 11.42 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-4 6861378 176.2 ns/op 5.674 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-8 5074005 232.1 ns/op 4.309 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q 32169210 37.33 ns/op 26.79 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-2 12993656 93.37 ns/op 10.71 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-4 6731583 177.8 ns/op 5.625 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-8 5387362 238.3 ns/op 4.196 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru 42774838 28.21 ns/op 35.45 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-2 46781269 25.68 ns/op 38.94 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-4 70858644 16.23 ns/op 61.62 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-8 33342788 35.63 ns/op 28.07 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq 55215992 21.75 ns/op 45.98 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-2 73125398 16.45 ns/op 60.78 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-4 100000000 10.91 ns/op 91.68 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-8 56294308 20.79 ns/op 48.10 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve 41389777 28.98 ns/op 34.51 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-2 77097078 15.58 ns/op 64.18 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-4 147165146 8.197 ns/op 122.0 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-8 257050272 4.675 ns/op 213.9 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo 42820501 28.16 ns/op 35.52 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 79347802 15.20 ns/op 65.79 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 154421679 7.779 ns/op 128.5 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 230287711 4.515 ns/op 221.5 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu 41715430 28.96 ns/op 34.53 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 78180774 15.57 ns/op 64.21 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 147327788 8.075 ns/op 123.8 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 232740117 5.150 ns/op 194.2 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter 31314933 39.35 ns/op 25.41 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-2 59060689 20.28 ns/op 49.30 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-4 100000000 10.63 ns/op 94.06 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-8 211001500 5.692 ns/op 175.7 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru 41057106 29.27 ns/op 34.16 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-2 13772121 86.12 ns/op 11.61 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-4 7168852 168.2 ns/op 5.944 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-8 5122022 234.8 ns/op 4.259 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q 38881980 30.93 ns/op 32.33 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 14319937 84.12 ns/op 11.89 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 7064800 168.2 ns/op 5.945 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 5334968 229.0 ns/op 4.367 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru 45952656 26.13 ns/op 38.28 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-2 47565804 25.23 ns/op 39.64 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-4 74243067 16.08 ns/op 62.20 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-8 40876633 28.43 ns/op 35.18 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq 55284996 21.50 ns/op 46.51 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-2 70555376 17.11 ns/op 58.45 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-4 100000000 11.52 ns/op 86.82 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-8 52422158 23.37 ns/op 42.79 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve 37083774 32.28 ns/op 30.97 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-2 59409616 20.19 ns/op 49.53 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-4 100000000 10.78 ns/op 92.73 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-8 81429770 14.60 ns/op 68.48 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo 40228688 29.94 ns/op 33.40 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 65994955 18.07 ns/op 55.33 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 100000000 10.36 ns/op 96.48 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 83811073 14.27 ns/op 70.06 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu 39507420 30.09 ns/op 33.24 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 62163146 19.32 ns/op 51.77 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 98666635 12.08 ns/op 82.76 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 76309785 15.98 ns/op 62.59 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter 26425146 46.26 ns/op 21.61 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-2 47110089 25.81 ns/op 38.75 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-4 85482261 14.38 ns/op 69.54 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-8 92209573 12.41 ns/op 80.61 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru 38472121 31.48 ns/op 31.76 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-2 13940257 86.54 ns/op 11.55 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-4 7043775 169.8 ns/op 5.889 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-8 5116540 234.7 ns/op 4.261 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q 37730163 32.04 ns/op 31.22 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 14101844 84.52 ns/op 11.83 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 7080013 168.4 ns/op 5.940 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 5473058 228.4 ns/op 4.379 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru 43302735 27.62 ns/op 36.21 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-2 44016909 27.26 ns/op 36.69 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-4 67641199 17.66 ns/op 56.61 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-8 37515435 31.94 ns/op 31.31 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq 45509276 26.55 ns/op 37.67 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-2 66586207 18.02 ns/op 55.48 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-4 98889886 12.13 ns/op 82.42 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-8 43361150 27.05 ns/op 36.97 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve 34541650 34.90 ns/op 28.65 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-2 45768117 25.99 ns/op 38.48 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-4 65105635 18.31 ns/op 54.60 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-8 45822950 26.85 ns/op 37.25 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo 35148183 34.40 ns/op 29.07 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 47073129 25.30 ns/op 39.52 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 75300217 15.92 ns/op 62.83 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 43368268 26.90 ns/op 37.17 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu 33211174 35.94 ns/op 27.83 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 44396211 27.06 ns/op 36.96 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 63967305 18.62 ns/op 53.70 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 41781879 28.77 ns/op 34.76 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter 20864605 57.60 ns/op 17.36 Mops/s 3 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-2 33540632 34.91 ns/op 28.65 Mops/s 3 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-4 59727368 19.91 ns/op 50.24 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-8 53490633 21.47 ns/op 46.57 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru 39588444 30.70 ns/op 32.57 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-2 13461969 86.36 ns/op 11.58 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-4 6507898 173.3 ns/op 5.769 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-8 5387302 226.1 ns/op 4.422 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q 34544054 33.90 ns/op 29.50 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 13653132 86.31 ns/op 11.59 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 7004014 169.2 ns/op 5.909 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 5132178 224.7 ns/op 4.451 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru 19839697 60.38 ns/op 16.56 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-2 27177322 44.19 ns/op 22.63 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-4 43995594 27.72 ns/op 36.07 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-8 36580438 32.15 ns/op 31.11 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq 20186146 59.11 ns/op 16.92 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-2 28844390 41.82 ns/op 23.91 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-4 45857973 25.90 ns/op 38.61 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-8 37112828 31.59 ns/op 31.66 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve 15981939 74.59 ns/op 13.41 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-2 16803133 70.91 ns/op 14.10 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-4 22693371 53.22 ns/op 18.79 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-8 14743501 83.34 ns/op 12.00 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo 10405796 116.1 ns/op 8.616 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-2 13334301 89.95 ns/op 11.12 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-4 18923277 63.47 ns/op 15.76 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-8 12626488 94.76 ns/op 10.55 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu 9817857 122.4 ns/op 8.167 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-2 11996580 99.60 ns/op 10.04 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-4 16979919 69.11 ns/op 14.47 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-8 12087908 102.4 ns/op 9.770 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=otter 4506312 279.8 ns/op 3.574 Mops/s 103 B/op 2 allocs/op -BenchmarkEvict/cache=otter-2 7751901 160.6 ns/op 6.226 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-4 8318157 151.4 ns/op 6.603 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-8 7686132 162.4 ns/op 6.157 Mops/s 103 B/op 2 allocs/op -BenchmarkEvict/cache=golang-lru 8942504 133.7 ns/op 7.478 Mops/s 72 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-2 7184834 159.7 ns/op 6.261 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-4 5147833 226.2 ns/op 4.420 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-8 3961438 310.7 ns/op 3.219 Mops/s 72 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru/2q 4745709 266.1 ns/op 3.758 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-2 4560388 282.4 ns/op 3.541 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-4 3903084 331.7 ns/op 3.015 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-8 2868652 438.1 ns/op 2.283 Mops/s 123 B/op 1 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru 36609362 33.58 ns/op 29.78 Mops/s 83.98 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 41934338 28.66 ns/op 34.90 Mops/s 83.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 66286897 18.25 ns/op 54.78 Mops/s 83.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 38681964 31.21 ns/op 32.04 Mops/s 83.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq 38596843 31.39 ns/op 31.86 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 42638050 28.26 ns/op 35.39 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 67663290 17.80 ns/op 56.17 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 40642891 30.00 ns/op 33.33 Mops/s 85.53 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve 32245856 34.84 ns/op 28.70 Mops/s 87.72 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 50126794 23.33 ns/op 42.86 Mops/s 87.80 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 83056000 13.78 ns/op 72.58 Mops/s 87.83 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 59108204 18.63 ns/op 53.69 Mops/s 87.71 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 26450360 45.24 ns/op 22.11 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 42627702 27.98 ns/op 35.74 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 67945840 16.05 ns/op 62.31 Mops/s 86.77 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 51360428 23.20 ns/op 43.11 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 24897384 45.65 ns/op 21.91 Mops/s 88.06 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 40931882 28.70 ns/op 34.84 Mops/s 88.07 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 69385718 16.75 ns/op 59.69 Mops/s 88.05 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 53523440 21.72 ns/op 46.05 Mops/s 88.00 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter 13744713 78.64 ns/op 12.72 Mops/s 87.03 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-2 22348328 55.42 ns/op 18.04 Mops/s 86.47 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-4 47590011 25.27 ns/op 39.57 Mops/s 87.48 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-8 27995356 42.64 ns/op 23.45 Mops/s 87.43 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru 18567276 60.01 ns/op 16.66 Mops/s 83.96 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 10687887 115.2 ns/op 8.681 Mops/s 83.96 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 5953616 208.3 ns/op 4.800 Mops/s 83.97 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 4149444 280.4 ns/op 3.567 Mops/s 83.98 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 13365496 91.98 ns/op 10.87 Mops/s 85.25 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 8337943 147.6 ns/op 6.776 Mops/s 85.27 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 5772378 205.0 ns/op 4.878 Mops/s 85.26 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 4158085 288.3 ns/op 3.468 Mops/s 85.31 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru 10880528 114.2 ns/op 8.755 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 15125787 74.11 ns/op 13.49 Mops/s 88.43 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 27408836 45.19 ns/op 22.13 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 34919798 33.02 ns/op 30.29 Mops/s 88.42 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq 10324892 118.3 ns/op 8.455 Mops/s 88.95 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 14370855 85.14 ns/op 11.75 Mops/s 89.09 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 22915832 55.40 ns/op 18.05 Mops/s 89.28 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 33153787 34.52 ns/op 28.97 Mops/s 89.37 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve 10176444 112.6 ns/op 8.878 Mops/s 89.74 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 18216825 63.30 ns/op 15.80 Mops/s 89.86 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 33109346 36.89 ns/op 27.11 Mops/s 90.01 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 48354438 23.65 ns/op 42.28 Mops/s 90.11 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 8999766 137.5 ns/op 7.272 Mops/s 89.86 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 15521899 82.79 ns/op 12.08 Mops/s 89.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 28247479 43.81 ns/op 22.82 Mops/s 90.08 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 42253954 27.28 ns/op 36.65 Mops/s 90.17 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 8144718 133.8 ns/op 7.476 Mops/s 89.87 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 15868957 77.51 ns/op 12.90 Mops/s 90.02 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 28399705 43.11 ns/op 23.20 Mops/s 90.23 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 40493058 26.93 ns/op 37.14 Mops/s 90.36 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter 5478254 217.6 ns/op 4.595 Mops/s 89.58 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-2 9533269 114.2 ns/op 8.753 Mops/s 89.59 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-4 19372309 63.51 ns/op 15.75 Mops/s 89.82 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-8 19367046 56.04 ns/op 17.84 Mops/s 89.82 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru 6643394 159.2 ns/op 6.282 Mops/s 88.42 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 4429648 274.0 ns/op 3.650 Mops/s 88.42 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 3816820 314.0 ns/op 3.184 Mops/s 88.43 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3210925 356.5 ns/op 2.805 Mops/s 88.43 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 5186284 231.7 ns/op 4.316 Mops/s 89.43 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 3527031 343.8 ns/op 2.909 Mops/s 89.44 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 3211065 387.8 ns/op 2.579 Mops/s 89.42 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2674813 433.8 ns/op 2.305 Mops/s 89.43 hit% 17 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru 42157652 25.01 ns/op 39.98 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-2 47276122 25.31 ns/op 39.51 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-4 73272561 17.41 ns/op 57.45 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-8 41822958 28.85 ns/op 34.66 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq 59210036 20.42 ns/op 48.96 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-2 75388722 15.92 ns/op 62.81 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-4 90982323 11.17 ns/op 89.54 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-8 46108033 26.38 ns/op 37.90 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve 48458008 25.03 ns/op 39.95 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-2 95599437 12.35 ns/op 80.97 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-4 193932889 9.085 ns/op 110.1 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-8 387389920 3.101 ns/op 322.5 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo 49419493 24.10 ns/op 41.50 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-2 86509604 12.67 ns/op 78.90 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-4 187528372 6.173 ns/op 162.0 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-8 367117816 3.807 ns/op 262.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu 37493935 31.45 ns/op 31.80 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-2 78166556 13.17 ns/op 75.93 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-4 188581000 6.352 ns/op 157.4 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-8 375668719 3.195 ns/op 313.0 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter 31352671 38.36 ns/op 26.07 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-2 60482979 24.71 ns/op 40.47 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-4 83522074 13.21 ns/op 75.71 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-8 191663659 5.505 ns/op 181.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru 38101083 30.66 ns/op 32.62 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-2 12586047 92.14 ns/op 10.85 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-4 6278937 191.2 ns/op 5.229 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-8 4335490 232.2 ns/op 4.306 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q 37543458 39.08 ns/op 25.59 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-2 8973631 150.2 ns/op 6.657 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-4 5894097 203.4 ns/op 4.916 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-8 3904663 291.0 ns/op 3.437 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru 46008520 26.23 ns/op 38.13 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-2 44009509 27.24 ns/op 36.71 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-4 53730439 20.32 ns/op 49.21 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-8 28765336 42.19 ns/op 23.70 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq 52662663 22.72 ns/op 44.01 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-2 55965363 21.46 ns/op 46.60 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-4 70521691 16.36 ns/op 61.11 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-8 31504676 38.32 ns/op 26.10 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve 27544152 43.97 ns/op 22.75 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-2 22551356 53.40 ns/op 18.73 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-4 23065482 52.24 ns/op 19.14 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-8 12345355 84.73 ns/op 11.80 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo 26603409 48.11 ns/op 20.79 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-2 14994127 101.2 ns/op 9.884 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-4 8614059 116.9 ns/op 8.558 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-8 13018855 93.54 ns/op 10.69 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu 25648081 44.74 ns/op 22.35 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-2 20027871 60.60 ns/op 16.50 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-4 18939729 62.86 ns/op 15.91 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-8 14156257 94.14 ns/op 10.62 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=otter 9803150 124.8 ns/op 8.011 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-2 14100732 81.86 ns/op 12.22 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-4 10899961 110.5 ns/op 9.049 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-8 16211049 97.24 ns/op 10.28 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=golang-lru 30266312 43.41 ns/op 23.04 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-2 10050402 120.5 ns/op 8.298 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-4 5483875 221.2 ns/op 4.522 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-8 4378783 287.5 ns/op 3.478 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q 30261223 47.24 ns/op 21.17 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-2 9229100 131.1 ns/op 7.626 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-4 5433880 215.8 ns/op 4.634 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-8 4755507 248.7 ns/op 4.020 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru 48453933 24.43 ns/op 40.93 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-2 47876478 25.57 ns/op 39.10 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-4 71541951 17.18 ns/op 58.20 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-8 41670404 28.63 ns/op 34.93 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq 55181186 21.87 ns/op 45.73 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-2 69703278 17.08 ns/op 58.54 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-4 100000000 16.65 ns/op 60.05 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-8 54739218 21.92 ns/op 45.62 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve 41188988 26.16 ns/op 38.22 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-2 84180498 14.31 ns/op 69.86 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-4 167935081 7.181 ns/op 139.3 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-8 293106411 4.098 ns/op 244.0 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo 48938476 24.72 ns/op 40.45 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 43048620 31.56 ns/op 31.68 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 156396986 7.573 ns/op 132.1 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 295869202 4.596 ns/op 217.6 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu 49781943 24.01 ns/op 41.65 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 87643486 13.54 ns/op 73.83 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 166945052 7.370 ns/op 135.7 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 263499234 6.693 ns/op 149.4 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter 30062661 43.07 ns/op 23.22 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-2 54503956 22.22 ns/op 45.01 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-4 100000000 11.03 ns/op 90.69 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-8 207066637 5.797 ns/op 172.5 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru 39906441 30.51 ns/op 32.77 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-2 12858486 98.29 ns/op 10.17 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-4 6891736 187.9 ns/op 5.321 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-8 4770540 259.9 ns/op 3.847 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q 38292373 32.03 ns/op 31.22 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 12952662 102.8 ns/op 9.732 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 6700304 184.3 ns/op 5.427 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 4976802 244.3 ns/op 4.093 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru 46452135 25.66 ns/op 38.97 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-2 44881065 28.45 ns/op 35.16 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-4 57202783 23.51 ns/op 42.53 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-8 40778529 29.71 ns/op 33.66 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq 55191231 22.20 ns/op 45.04 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-2 68528514 24.63 ns/op 40.60 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-4 37224307 34.50 ns/op 28.98 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-8 40860742 29.08 ns/op 34.39 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve 42016009 28.02 ns/op 35.69 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-2 45398798 24.89 ns/op 40.17 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-4 46466976 25.67 ns/op 38.96 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-8 49502227 20.33 ns/op 49.18 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo 37395603 31.06 ns/op 32.20 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 56692645 18.09 ns/op 55.28 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 100000000 11.60 ns/op 86.17 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 77040567 15.57 ns/op 64.22 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu 43615479 29.13 ns/op 34.33 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 56978589 21.86 ns/op 45.75 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 90693522 19.66 ns/op 50.88 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 67779889 19.58 ns/op 51.07 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter 23290888 52.25 ns/op 19.14 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-2 39489271 31.78 ns/op 31.46 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-4 43498486 26.73 ns/op 37.41 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-8 58012233 19.09 ns/op 52.39 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru 36831847 30.55 ns/op 32.74 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-2 13283354 89.52 ns/op 11.17 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-4 6497043 179.3 ns/op 5.577 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-8 4742571 268.2 ns/op 3.729 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q 32961524 34.73 ns/op 28.79 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 11244649 99.81 ns/op 10.02 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 6444146 203.9 ns/op 4.904 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 4186098 279.0 ns/op 3.584 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru 40739534 28.46 ns/op 35.14 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-2 26755032 37.39 ns/op 26.74 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-4 57221421 44.54 ns/op 22.45 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-8 26368410 42.61 ns/op 23.47 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq 42707286 26.27 ns/op 38.07 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-2 47728345 28.80 ns/op 34.72 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-4 31113001 38.13 ns/op 26.23 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-8 34840507 34.79 ns/op 28.75 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve 36968149 34.05 ns/op 29.36 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-2 44910966 25.29 ns/op 39.54 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-4 69264568 44.62 ns/op 22.41 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-8 31339434 36.37 ns/op 27.50 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo 34933099 31.32 ns/op 31.93 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 47230226 25.68 ns/op 38.94 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 63844219 41.93 ns/op 23.85 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 37105698 28.15 ns/op 35.52 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu 39578379 31.88 ns/op 31.37 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 20693401 51.72 ns/op 19.34 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 20768925 48.54 ns/op 20.60 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 39377883 29.74 ns/op 33.63 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter 20509971 58.88 ns/op 16.98 Mops/s 3 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-2 34166577 35.69 ns/op 28.02 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-4 48967431 27.26 ns/op 36.69 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-8 54878571 21.17 ns/op 47.24 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru 38957980 30.59 ns/op 32.69 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-2 13444065 89.76 ns/op 11.14 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-4 6732679 176.1 ns/op 5.678 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-8 4699708 252.6 ns/op 3.959 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q 35505409 33.70 ns/op 29.67 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 13178708 88.79 ns/op 11.26 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 6959042 174.1 ns/op 5.742 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 4893722 241.6 ns/op 4.140 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru 21196060 56.28 ns/op 17.77 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-2 29156378 41.42 ns/op 24.14 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-4 47866374 26.20 ns/op 38.17 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-8 37713710 31.93 ns/op 31.32 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq 20768371 59.13 ns/op 16.91 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-2 28065361 42.51 ns/op 23.52 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-4 44140297 27.63 ns/op 36.19 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-8 37049520 33.01 ns/op 30.29 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve 17123348 69.63 ns/op 14.36 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-2 17307432 70.75 ns/op 14.13 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-4 21265629 54.33 ns/op 18.41 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-8 14352114 83.33 ns/op 12.00 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo 10694503 104.7 ns/op 9.548 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-2 14092983 84.99 ns/op 11.77 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-4 18665954 61.70 ns/op 16.21 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-8 12370166 97.18 ns/op 10.29 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu 10100864 116.4 ns/op 8.593 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-2 12138458 100.2 ns/op 9.985 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-4 15656598 71.78 ns/op 13.93 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-8 11848146 103.2 ns/op 9.693 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=otter 4333740 290.9 ns/op 3.437 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=otter-2 7201947 167.7 ns/op 5.963 Mops/s 100 B/op 2 allocs/op +BenchmarkEvict/cache=otter-4 7623655 157.7 ns/op 6.343 Mops/s 104 B/op 2 allocs/op +BenchmarkEvict/cache=otter-8 7854703 172.1 ns/op 5.809 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=golang-lru 8738293 135.0 ns/op 7.408 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-2 6874857 169.6 ns/op 5.895 Mops/s 72 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-4 4939566 243.4 ns/op 4.108 Mops/s 72 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-8 3480660 340.1 ns/op 2.940 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru/2q 4587828 285.9 ns/op 3.497 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-2 4232223 310.6 ns/op 3.220 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-4 3517891 353.0 ns/op 2.833 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-8 2733838 454.8 ns/op 2.199 Mops/s 122 B/op 1 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru 36780481 32.24 ns/op 31.01 Mops/s 83.98 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 40989730 28.93 ns/op 34.57 Mops/s 83.96 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 56554200 21.80 ns/op 45.87 Mops/s 83.96 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 39893007 27.74 ns/op 36.05 Mops/s 83.97 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq 38227465 33.62 ns/op 29.74 Mops/s 85.57 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 41009576 29.03 ns/op 34.44 Mops/s 85.57 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 62501626 25.21 ns/op 39.67 Mops/s 85.56 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 43302344 27.23 ns/op 36.72 Mops/s 85.53 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve 34925558 31.97 ns/op 31.28 Mops/s 87.75 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 53384146 22.71 ns/op 44.04 Mops/s 87.80 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 83283450 14.48 ns/op 69.08 Mops/s 87.80 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 60808629 17.65 ns/op 56.65 Mops/s 87.72 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 28433013 41.98 ns/op 23.82 Mops/s 86.78 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 44101904 27.05 ns/op 36.97 Mops/s 86.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 66265849 16.46 ns/op 60.75 Mops/s 86.77 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 45820616 24.06 ns/op 41.56 Mops/s 86.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 27118041 44.07 ns/op 22.69 Mops/s 88.07 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 42226942 38.92 ns/op 25.70 Mops/s 88.05 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 25864274 55.38 ns/op 18.06 Mops/s 88.00 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 31456844 36.14 ns/op 27.67 Mops/s 87.99 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter 12192219 124.4 ns/op 8.036 Mops/s 86.99 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-2 14142986 93.26 ns/op 10.72 Mops/s 87.41 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-4 19651351 62.46 ns/op 16.01 Mops/s 87.48 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-8 16075401 70.00 ns/op 14.28 Mops/s 87.52 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru 13832726 99.09 ns/op 10.09 Mops/s 83.98 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 6211039 205.0 ns/op 4.879 Mops/s 83.94 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 5496975 225.6 ns/op 4.433 Mops/s 83.97 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 4176848 320.1 ns/op 3.124 Mops/s 83.96 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 12192643 108.7 ns/op 9.201 Mops/s 85.28 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 7867342 160.6 ns/op 6.228 Mops/s 85.28 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 5552232 222.8 ns/op 4.488 Mops/s 85.25 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 4000011 310.8 ns/op 3.218 Mops/s 85.24 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru 9479833 139.3 ns/op 7.181 Mops/s 88.45 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 12198080 88.25 ns/op 11.33 Mops/s 88.44 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 16915017 63.93 ns/op 15.64 Mops/s 88.44 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 35623416 34.30 ns/op 29.16 Mops/s 88.43 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq 9201724 131.8 ns/op 7.588 Mops/s 88.93 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 13110789 101.1 ns/op 9.888 Mops/s 89.05 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 18019675 64.86 ns/op 15.42 Mops/s 89.20 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 34371682 35.99 ns/op 27.79 Mops/s 89.39 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve 9218391 127.3 ns/op 7.855 Mops/s 89.72 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 16220289 73.34 ns/op 13.63 Mops/s 89.84 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 22127887 52.54 ns/op 19.03 Mops/s 89.93 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 44874910 24.56 ns/op 40.72 Mops/s 90.09 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 6790437 174.0 ns/op 5.746 Mops/s 89.81 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 10019265 119.4 ns/op 8.376 Mops/s 89.87 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 19983000 60.56 ns/op 16.51 Mops/s 90.01 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 39218194 28.97 ns/op 34.52 Mops/s 90.15 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 5589326 218.6 ns/op 4.575 Mops/s 89.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 12463862 113.5 ns/op 8.814 Mops/s 89.98 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 20222446 60.05 ns/op 16.65 Mops/s 90.09 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 38677964 29.98 ns/op 33.35 Mops/s 90.34 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter 4293474 290.8 ns/op 3.439 Mops/s 89.57 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-2 8861679 137.7 ns/op 7.260 Mops/s 89.58 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-4 15217129 78.57 ns/op 12.73 Mops/s 89.76 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-8 18651194 58.69 ns/op 17.04 Mops/s 89.78 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru 6857503 173.9 ns/op 5.752 Mops/s 88.45 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 3834328 330.2 ns/op 3.028 Mops/s 88.43 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 3019425 343.4 ns/op 2.912 Mops/s 88.44 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3119874 389.5 ns/op 2.567 Mops/s 88.44 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 5078224 239.8 ns/op 4.171 Mops/s 89.39 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 2851796 405.3 ns/op 2.467 Mops/s 89.42 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 2881321 421.3 ns/op 2.374 Mops/s 89.44 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2660245 447.1 ns/op 2.237 Mops/s 89.42 hit% 17 B/op 0 allocs/op PASS -ok github.com/floatdrop/evict/bench 437.422s +ok github.com/floatdrop/evict/bench 482.234s go: go1.27.3 golang-lru: v2.0.7 otter: v2.4.0 @@ -535,264 +535,264 @@ goos: darwin goarch: arm64 pkg: github.com/floatdrop/evict/bench cpu: Apple M3 Max -BenchmarkGet/cache=evict/lru 44929468 26.89 ns/op 37.19 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-2 47342413 25.51 ns/op 39.21 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-4 69088438 16.67 ns/op 60.00 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-8 43351034 27.72 ns/op 36.07 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq 55143046 21.87 ns/op 45.72 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-2 72881684 16.18 ns/op 61.82 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-4 100000000 10.46 ns/op 95.65 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-8 51095719 23.46 ns/op 42.63 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve 43055312 28.06 ns/op 35.63 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-2 83794984 14.29 ns/op 69.97 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-4 147901294 7.988 ns/op 125.2 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-8 320925512 3.738 ns/op 267.5 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo 41269494 29.21 ns/op 34.23 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-2 79977787 14.65 ns/op 68.25 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-4 171502510 9.687 ns/op 103.2 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-8 331815201 3.619 ns/op 276.3 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu 43067222 28.03 ns/op 35.67 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-2 80639292 14.80 ns/op 67.57 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-4 152115739 7.803 ns/op 128.2 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-8 302122155 3.967 ns/op 252.1 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter 32686748 36.78 ns/op 27.19 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-2 62499322 19.17 ns/op 52.18 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-4 123020732 9.718 ns/op 102.9 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-8 242238180 4.943 ns/op 202.3 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru 41586405 28.80 ns/op 34.72 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-2 13832506 85.13 ns/op 11.75 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-4 7207814 167.5 ns/op 5.970 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-8 5417295 235.1 ns/op 4.254 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q 39422946 30.18 ns/op 33.14 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-2 14379961 83.03 ns/op 12.04 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-4 7081930 170.7 ns/op 5.859 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-8 5512178 222.2 ns/op 4.500 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru 43773386 27.36 ns/op 36.55 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-2 43303647 27.79 ns/op 35.99 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-4 62339954 19.25 ns/op 51.95 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-8 28835697 40.71 ns/op 24.57 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq 50506026 23.07 ns/op 43.34 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-2 56974308 21.24 ns/op 47.08 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-4 68826411 14.82 ns/op 67.46 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-8 35763290 33.27 ns/op 30.06 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve 26865520 44.54 ns/op 22.45 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-2 22769929 52.84 ns/op 18.93 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-4 23960943 50.50 ns/op 19.80 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-8 16936921 70.85 ns/op 14.12 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo 27021777 43.58 ns/op 22.95 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-2 22774575 52.78 ns/op 18.95 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-4 26964801 44.76 ns/op 22.34 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-8 16130522 73.60 ns/op 13.59 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu 26022019 45.99 ns/op 21.74 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-2 21160304 57.10 ns/op 17.51 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-4 20471149 53.48 ns/op 18.70 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-8 15808123 76.43 ns/op 13.08 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=otter 10680757 111.4 ns/op 8.975 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-2 16873464 70.05 ns/op 14.28 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-4 27013387 44.74 ns/op 22.35 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-8 18924583 62.86 ns/op 15.91 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=golang-lru 38528324 31.13 ns/op 32.12 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-2 13724899 85.28 ns/op 11.73 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-4 7086442 169.8 ns/op 5.891 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-8 5142567 231.1 ns/op 4.327 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q 32522712 37.12 ns/op 26.94 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-2 13065632 91.44 ns/op 10.94 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-4 6743402 178.8 ns/op 5.592 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-8 5141450 238.4 ns/op 4.194 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru 44736127 26.85 ns/op 37.24 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-2 47699649 25.20 ns/op 39.69 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-4 75029115 15.83 ns/op 63.18 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-8 34766064 33.51 ns/op 29.84 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq 56253514 21.17 ns/op 47.24 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-2 74210162 16.19 ns/op 61.76 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-4 100000000 12.33 ns/op 81.13 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-8 54549895 21.72 ns/op 46.04 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve 40676414 29.45 ns/op 33.96 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-2 80473452 15.00 ns/op 66.65 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-4 141428934 8.442 ns/op 118.5 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-8 247579522 4.846 ns/op 206.4 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo 41905414 28.66 ns/op 34.89 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 81837246 14.70 ns/op 68.04 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 157002157 7.734 ns/op 129.3 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 251839741 4.771 ns/op 209.6 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu 41240952 28.76 ns/op 34.77 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 78260018 15.36 ns/op 65.11 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 155024880 7.813 ns/op 128.0 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 201316357 5.963 ns/op 167.7 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter 31732844 38.68 ns/op 25.85 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-2 58084072 20.76 ns/op 48.18 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-4 100000000 10.67 ns/op 93.73 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-8 202819171 5.909 ns/op 169.2 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru 41396618 29.12 ns/op 34.34 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-2 13829776 85.86 ns/op 11.65 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-4 7096920 168.0 ns/op 5.952 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-8 5455092 235.3 ns/op 4.251 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q 39579902 30.37 ns/op 32.93 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 14317616 83.64 ns/op 11.96 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 7092758 168.7 ns/op 5.927 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 5599128 219.9 ns/op 4.547 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru 45889465 26.07 ns/op 38.36 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-2 45900217 26.25 ns/op 38.09 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-4 63024520 16.48 ns/op 60.68 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-8 39846480 29.44 ns/op 33.96 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq 50949825 23.56 ns/op 42.45 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-2 65776700 18.15 ns/op 55.09 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-4 100000000 13.80 ns/op 72.49 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-8 51414799 23.09 ns/op 43.32 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve 39859770 30.24 ns/op 33.06 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-2 61025738 19.47 ns/op 51.37 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-4 100000000 10.83 ns/op 92.35 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-8 82024876 14.59 ns/op 68.56 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo 40819449 29.37 ns/op 34.05 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 66255027 18.10 ns/op 55.23 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 100000000 10.15 ns/op 98.52 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 84628220 13.66 ns/op 73.18 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu 34938862 30.43 ns/op 32.86 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 60411424 19.77 ns/op 50.58 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 100000000 12.81 ns/op 78.04 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 73500699 16.18 ns/op 61.82 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter 27309760 45.99 ns/op 21.74 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-2 47356814 26.32 ns/op 38.00 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-4 85486068 14.63 ns/op 68.37 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-8 97181398 12.19 ns/op 82.04 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru 40543850 29.58 ns/op 33.81 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-2 14056438 85.47 ns/op 11.70 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-4 6808938 172.2 ns/op 5.808 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-8 5411931 221.2 ns/op 4.521 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q 37689280 31.73 ns/op 31.51 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 14163754 83.61 ns/op 11.96 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 7140505 168.1 ns/op 5.948 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 5236491 223.7 ns/op 4.471 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru 41091492 29.39 ns/op 34.03 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-2 45844905 26.09 ns/op 38.33 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-4 64503268 18.67 ns/op 53.56 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-8 36919574 32.18 ns/op 31.07 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq 46629027 25.54 ns/op 39.16 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-2 66143944 17.99 ns/op 55.60 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-4 89063716 13.75 ns/op 72.72 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-8 45190646 26.62 ns/op 37.57 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve 34273351 33.29 ns/op 30.04 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-2 46925178 25.66 ns/op 38.98 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-4 64678983 18.55 ns/op 53.91 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-8 43977992 26.50 ns/op 37.73 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo 36559450 32.74 ns/op 30.54 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 48508694 24.78 ns/op 40.36 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 75563181 16.71 ns/op 59.83 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 44524696 26.67 ns/op 37.49 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu 36539736 32.69 ns/op 30.59 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 43844358 27.41 ns/op 36.48 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 61514407 18.72 ns/op 53.41 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 39597316 29.30 ns/op 34.13 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter 20986297 57.23 ns/op 17.47 Mops/s 3 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-2 34994647 34.39 ns/op 29.08 Mops/s 3 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-4 60018004 20.21 ns/op 49.48 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-8 55653895 20.96 ns/op 47.72 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru 39436604 30.41 ns/op 32.88 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-2 13892868 85.63 ns/op 11.68 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-4 6986002 170.9 ns/op 5.853 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-8 5148068 234.9 ns/op 4.258 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q 35795650 33.57 ns/op 29.79 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 14143402 86.06 ns/op 11.62 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 6786338 170.7 ns/op 5.858 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 5482778 230.6 ns/op 4.336 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru 18202399 60.57 ns/op 16.51 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-2 27270892 44.02 ns/op 22.72 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-4 44347536 27.15 ns/op 36.84 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-8 36901219 31.66 ns/op 31.59 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq 20409868 58.97 ns/op 16.96 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-2 28571202 42.22 ns/op 23.69 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-4 45819306 25.88 ns/op 38.63 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-8 36570499 32.02 ns/op 31.23 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve 16012533 74.64 ns/op 13.40 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-2 16952055 70.51 ns/op 14.18 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-4 22172846 54.76 ns/op 18.26 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-8 14620431 81.53 ns/op 12.27 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo 10352535 116.1 ns/op 8.614 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-2 13243911 90.38 ns/op 11.06 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-4 19160668 62.61 ns/op 15.97 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-8 12618892 94.80 ns/op 10.55 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu 9929410 122.0 ns/op 8.197 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-2 12036027 101.6 ns/op 9.842 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-4 16827524 76.21 ns/op 13.12 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-8 12166560 100.9 ns/op 9.912 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=otter 4523257 278.9 ns/op 3.586 Mops/s 103 B/op 2 allocs/op -BenchmarkEvict/cache=otter-2 7646018 160.3 ns/op 6.236 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-4 8380956 152.4 ns/op 6.563 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-8 7411332 165.6 ns/op 6.039 Mops/s 103 B/op 2 allocs/op -BenchmarkEvict/cache=golang-lru 8962321 133.7 ns/op 7.481 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-2 7527469 159.3 ns/op 6.276 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-4 5010088 225.1 ns/op 4.443 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-8 3937866 305.7 ns/op 3.271 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru/2q 4714442 268.4 ns/op 3.726 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-2 4611705 282.9 ns/op 3.534 Mops/s 123 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-4 3883987 330.0 ns/op 3.031 Mops/s 123 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-8 3508306 406.1 ns/op 2.462 Mops/s 123 B/op 1 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru 36467743 33.04 ns/op 30.26 Mops/s 83.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 42387600 28.35 ns/op 35.27 Mops/s 83.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 65411581 18.45 ns/op 54.21 Mops/s 83.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 41340583 28.90 ns/op 34.61 Mops/s 83.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq 38596118 31.41 ns/op 31.83 Mops/s 85.57 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 42408757 28.25 ns/op 35.40 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 59741370 19.88 ns/op 50.29 Mops/s 85.55 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 43238179 27.68 ns/op 36.13 Mops/s 85.54 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve 33196473 34.71 ns/op 28.81 Mops/s 87.76 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 49706593 23.27 ns/op 42.97 Mops/s 87.83 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 84229978 13.75 ns/op 72.74 Mops/s 87.81 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 58457214 18.74 ns/op 53.35 Mops/s 87.67 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 26429898 45.23 ns/op 22.11 Mops/s 86.76 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 42636346 27.82 ns/op 35.95 Mops/s 86.79 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 74443995 16.07 ns/op 62.25 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 50525517 23.05 ns/op 43.39 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 25723656 46.17 ns/op 21.66 Mops/s 88.01 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 40856222 28.77 ns/op 34.76 Mops/s 88.03 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 70104378 16.78 ns/op 59.61 Mops/s 88.03 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 53777896 21.34 ns/op 46.86 Mops/s 88.02 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter 15244128 78.31 ns/op 12.77 Mops/s 87.06 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-2 22576459 52.23 ns/op 19.14 Mops/s 87.42 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-4 50471240 23.96 ns/op 41.74 Mops/s 87.69 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-8 29019765 41.68 ns/op 23.99 Mops/s 87.65 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru 19303491 60.00 ns/op 16.67 Mops/s 83.97 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 10828227 113.4 ns/op 8.815 Mops/s 84.00 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 5820542 206.5 ns/op 4.841 Mops/s 83.95 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 4351430 283.0 ns/op 3.534 Mops/s 83.99 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 13170066 91.75 ns/op 10.90 Mops/s 85.28 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 8328344 145.1 ns/op 6.893 Mops/s 85.29 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 5875959 204.4 ns/op 4.891 Mops/s 85.33 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 4169961 285.8 ns/op 3.499 Mops/s 85.27 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru 10831579 110.0 ns/op 9.088 Mops/s 88.43 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 16770130 73.49 ns/op 13.61 Mops/s 88.43 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 27130957 46.01 ns/op 21.73 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 34712302 33.23 ns/op 30.09 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq 10202204 119.1 ns/op 8.395 Mops/s 88.95 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 13953690 88.10 ns/op 11.35 Mops/s 89.08 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 23688846 55.07 ns/op 18.16 Mops/s 89.28 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 33964186 34.41 ns/op 29.06 Mops/s 89.38 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve 9838908 110.6 ns/op 9.040 Mops/s 89.72 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 18560754 63.53 ns/op 15.74 Mops/s 89.87 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 33949230 35.69 ns/op 28.02 Mops/s 90.32 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 45042508 23.76 ns/op 42.10 Mops/s 90.10 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 8590731 139.8 ns/op 7.151 Mops/s 89.87 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 15226340 86.39 ns/op 11.58 Mops/s 89.98 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 27938028 49.98 ns/op 20.01 Mops/s 90.07 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 41990463 27.06 ns/op 36.96 Mops/s 90.17 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 7904582 143.7 ns/op 6.960 Mops/s 89.88 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 15332295 74.86 ns/op 13.36 Mops/s 90.03 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 28122609 43.18 ns/op 23.16 Mops/s 90.22 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 42557466 26.21 ns/op 38.16 Mops/s 90.39 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter 4856910 214.4 ns/op 4.664 Mops/s 89.58 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-2 10368054 109.3 ns/op 9.150 Mops/s 89.67 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-4 18374600 62.57 ns/op 15.98 Mops/s 89.78 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-8 20868415 55.95 ns/op 17.87 Mops/s 89.79 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru 7207947 158.7 ns/op 6.301 Mops/s 88.42 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 4440674 273.2 ns/op 3.660 Mops/s 88.41 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 3794152 326.4 ns/op 3.064 Mops/s 88.42 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3264834 345.2 ns/op 2.897 Mops/s 88.42 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 5296768 227.2 ns/op 4.401 Mops/s 89.39 hit% 18 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 3242557 346.0 ns/op 2.890 Mops/s 89.46 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 3131480 396.1 ns/op 2.525 Mops/s 89.42 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2758503 414.1 ns/op 2.415 Mops/s 89.44 hit% 17 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru 45209090 24.85 ns/op 40.24 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-2 47142862 25.91 ns/op 38.60 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-4 71434243 19.49 ns/op 51.32 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-8 43806144 28.40 ns/op 35.21 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq 55076820 21.74 ns/op 45.99 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-2 73993188 16.68 ns/op 59.95 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-4 97709596 11.10 ns/op 90.10 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-8 51734544 23.64 ns/op 42.29 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve 47878785 25.33 ns/op 39.48 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-2 99089956 11.88 ns/op 84.20 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-4 198834954 8.902 ns/op 112.3 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-8 318624778 3.787 ns/op 264.1 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo 47569810 24.57 ns/op 40.70 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-2 92796658 12.66 ns/op 78.99 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-4 192382173 6.058 ns/op 165.1 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-8 371563425 3.240 ns/op 308.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu 49017355 25.41 ns/op 39.35 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-2 89389083 12.60 ns/op 79.37 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-4 186419712 6.437 ns/op 155.4 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-8 368358268 3.257 ns/op 307.0 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter 31672297 37.80 ns/op 26.45 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-2 61164806 19.33 ns/op 51.74 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-4 126566485 9.557 ns/op 104.6 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-8 249406209 4.820 ns/op 207.5 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru 41094658 29.73 ns/op 33.64 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-2 13048234 89.18 ns/op 11.21 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-4 6427602 185.1 ns/op 5.404 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-8 4307248 273.5 ns/op 3.657 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q 38499945 31.99 ns/op 31.26 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-2 9881131 112.0 ns/op 8.932 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-4 5423611 224.4 ns/op 4.457 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-8 3740737 292.9 ns/op 3.414 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru 42210789 28.31 ns/op 35.32 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-2 29379091 34.59 ns/op 28.91 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-4 20815008 61.97 ns/op 16.14 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-8 23277429 47.20 ns/op 21.18 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq 48007041 22.45 ns/op 44.54 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-2 55970691 21.76 ns/op 45.95 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-4 61969866 18.17 ns/op 55.04 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-8 30059304 38.82 ns/op 25.76 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve 25530782 45.60 ns/op 21.93 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-2 21851886 56.28 ns/op 17.77 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-4 20785369 62.80 ns/op 15.92 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-8 10642995 115.3 ns/op 8.671 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo 26828257 46.86 ns/op 21.34 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-2 16688733 67.63 ns/op 14.79 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-4 9717674 109.1 ns/op 9.164 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-8 9652088 122.3 ns/op 8.178 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu 25517979 48.12 ns/op 20.78 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-2 15417393 72.12 ns/op 13.87 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-4 8756947 128.1 ns/op 7.808 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-8 11923534 98.42 ns/op 10.16 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=otter 9983180 115.5 ns/op 8.658 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-2 16375387 73.01 ns/op 13.70 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-4 23939532 52.94 ns/op 18.89 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-8 18134250 65.27 ns/op 15.32 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=golang-lru 38178867 31.56 ns/op 31.69 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-2 13200624 91.44 ns/op 10.94 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-4 5475982 220.8 ns/op 4.529 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-8 4203366 287.7 ns/op 3.475 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q 29478536 40.95 ns/op 24.42 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-2 8753223 122.1 ns/op 8.192 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-4 5396929 226.3 ns/op 4.418 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-8 3709404 313.4 ns/op 3.191 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru 46453710 26.12 ns/op 38.28 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-2 46983970 28.76 ns/op 34.77 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-4 60006421 17.26 ns/op 57.92 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-8 40314056 30.42 ns/op 32.88 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq 59531436 20.21 ns/op 49.48 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-2 67064395 18.55 ns/op 53.91 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-4 67910434 15.67 ns/op 63.82 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-8 52511143 22.44 ns/op 44.56 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve 46566451 24.91 ns/op 40.14 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-2 86646508 13.36 ns/op 74.88 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-4 166597684 7.218 ns/op 138.5 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-8 253044307 4.713 ns/op 212.2 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo 46937872 25.60 ns/op 39.06 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 92649783 13.16 ns/op 75.96 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 161413904 10.58 ns/op 94.55 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 286899996 4.194 ns/op 238.5 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu 47036918 25.62 ns/op 39.03 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 89237576 14.02 ns/op 71.34 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 148574948 7.814 ns/op 128.0 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 238899052 4.290 ns/op 233.1 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter 30695704 39.38 ns/op 25.39 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-2 57333170 21.37 ns/op 46.81 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-4 100000000 10.86 ns/op 92.05 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-8 213423333 5.635 ns/op 177.5 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru 40431721 29.95 ns/op 33.39 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-2 14050486 89.16 ns/op 11.22 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-4 6396139 174.6 ns/op 5.726 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-8 4720177 254.0 ns/op 3.937 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q 37700973 31.32 ns/op 31.93 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 13718485 89.34 ns/op 11.19 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 6772124 177.9 ns/op 5.621 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 4921209 246.2 ns/op 4.062 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru 46348076 26.06 ns/op 38.37 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-2 43865259 26.59 ns/op 37.61 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-4 70752284 25.12 ns/op 39.81 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-8 41640459 39.90 ns/op 25.07 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq 38512404 27.46 ns/op 36.41 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-2 29901976 39.79 ns/op 25.13 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-4 37864246 55.81 ns/op 17.92 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-8 42797913 56.35 ns/op 17.74 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve 35788134 156.6 ns/op 6.385 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-2 48736653 70.75 ns/op 14.13 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-4 46607068 41.71 ns/op 23.98 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-8 66200350 27.15 ns/op 36.83 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo 18422602 78.99 ns/op 12.66 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 25241503 39.86 ns/op 25.09 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 41318104 25.94 ns/op 38.55 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 68047726 20.59 ns/op 48.57 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu 42103293 28.33 ns/op 35.30 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 65029927 18.89 ns/op 52.94 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 93716744 12.33 ns/op 81.13 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 71807019 16.30 ns/op 61.36 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter 26951881 46.55 ns/op 21.48 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-2 46512529 26.70 ns/op 37.46 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-4 85936030 17.31 ns/op 57.77 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-8 93239187 12.61 ns/op 79.29 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru 40583156 29.95 ns/op 33.39 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-2 13351796 90.37 ns/op 11.07 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-4 6816396 180.8 ns/op 5.531 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-8 4725682 250.3 ns/op 3.996 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q 36670753 32.04 ns/op 31.21 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 13494176 88.16 ns/op 11.34 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 6623180 178.9 ns/op 5.591 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 4983544 245.7 ns/op 4.071 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru 46851360 25.49 ns/op 39.23 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-2 46228820 26.17 ns/op 38.21 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-4 68191988 18.11 ns/op 55.22 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-8 27500884 44.25 ns/op 22.60 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq 46280746 24.43 ns/op 40.94 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-2 65577202 18.39 ns/op 54.38 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-4 90996122 12.92 ns/op 77.42 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-8 36006030 34.00 ns/op 29.41 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve 39614692 30.29 ns/op 33.01 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-2 46110320 23.89 ns/op 41.86 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-4 66823981 16.76 ns/op 59.67 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-8 43276186 27.52 ns/op 36.34 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo 37409203 32.38 ns/op 30.88 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 50367260 23.86 ns/op 41.92 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 71108476 17.28 ns/op 57.86 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 44123392 27.27 ns/op 36.67 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu 40009002 29.96 ns/op 33.38 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 47247038 25.90 ns/op 38.62 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 60033516 18.57 ns/op 53.86 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 41982384 28.95 ns/op 34.55 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter 19098307 57.36 ns/op 17.43 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-2 34499941 34.85 ns/op 28.69 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-4 58260792 21.09 ns/op 47.42 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-8 53593659 21.52 ns/op 46.47 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru 39418089 30.75 ns/op 32.52 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-2 13704952 86.30 ns/op 11.59 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-4 6905298 173.8 ns/op 5.753 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-8 4962330 243.5 ns/op 4.107 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q 35428100 33.81 ns/op 29.58 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 13374956 86.89 ns/op 11.51 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 7094074 174.2 ns/op 5.740 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 5105977 234.7 ns/op 4.261 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru 21542341 55.40 ns/op 18.05 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-2 29603984 40.50 ns/op 24.69 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-4 47276046 25.77 ns/op 38.81 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-8 37329877 31.99 ns/op 31.26 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq 20502218 58.34 ns/op 17.14 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-2 28612274 42.18 ns/op 23.71 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-4 47017184 26.17 ns/op 38.21 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-8 37120290 31.81 ns/op 31.43 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve 16995522 69.25 ns/op 14.44 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-2 16910052 70.08 ns/op 14.27 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-4 22841950 51.98 ns/op 19.24 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-8 14786048 82.48 ns/op 12.12 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo 11559073 104.0 ns/op 9.611 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-2 14335147 84.28 ns/op 11.87 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-4 19866768 60.99 ns/op 16.40 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-8 12376768 95.57 ns/op 10.46 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu 10224828 115.8 ns/op 8.638 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-2 12154447 99.21 ns/op 10.08 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-4 16567710 70.86 ns/op 14.11 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-8 11790105 103.1 ns/op 9.703 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=otter 4357882 284.5 ns/op 3.515 Mops/s 104 B/op 2 allocs/op +BenchmarkEvict/cache=otter-2 7654460 162.1 ns/op 6.168 Mops/s 104 B/op 2 allocs/op +BenchmarkEvict/cache=otter-4 8232225 156.4 ns/op 6.393 Mops/s 104 B/op 2 allocs/op +BenchmarkEvict/cache=otter-8 7232767 179.2 ns/op 5.582 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=golang-lru 8988463 136.4 ns/op 7.330 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-2 7283476 163.2 ns/op 6.128 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-4 5349951 226.4 ns/op 4.418 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-8 3891204 306.9 ns/op 3.258 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru/2q 4704816 273.5 ns/op 3.656 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-2 4071379 289.1 ns/op 3.459 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-4 3790542 335.3 ns/op 2.982 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-8 3558213 345.2 ns/op 2.897 Mops/s 123 B/op 1 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru 37355684 31.71 ns/op 31.54 Mops/s 83.98 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 41010918 28.61 ns/op 34.95 Mops/s 83.97 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 57083959 19.52 ns/op 51.24 Mops/s 83.97 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 36077023 31.91 ns/op 31.34 Mops/s 83.95 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq 37662912 31.56 ns/op 31.68 Mops/s 85.58 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 41272393 28.74 ns/op 34.79 Mops/s 85.56 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 58229575 22.38 ns/op 44.68 Mops/s 85.57 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 44807886 27.00 ns/op 37.04 Mops/s 85.54 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve 37054620 31.86 ns/op 31.39 Mops/s 87.80 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 53348251 22.10 ns/op 45.25 Mops/s 87.84 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 90770980 13.52 ns/op 73.95 Mops/s 87.82 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 57971946 17.94 ns/op 55.73 Mops/s 87.72 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 29291124 41.62 ns/op 24.03 Mops/s 86.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 45223645 26.85 ns/op 37.24 Mops/s 86.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 73412638 16.96 ns/op 58.95 Mops/s 86.78 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 51625947 23.49 ns/op 42.56 Mops/s 86.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 27780162 42.81 ns/op 23.36 Mops/s 88.03 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 42872454 28.05 ns/op 35.66 Mops/s 88.04 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 70806552 17.04 ns/op 58.70 Mops/s 88.04 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 54922840 21.33 ns/op 46.89 Mops/s 88.00 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter 15291688 80.33 ns/op 12.45 Mops/s 87.03 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-2 22804402 52.47 ns/op 19.06 Mops/s 87.12 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-4 44293041 27.81 ns/op 35.96 Mops/s 87.69 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-8 27817164 43.78 ns/op 22.84 Mops/s 87.36 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru 18365016 59.83 ns/op 16.71 Mops/s 83.99 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 10556824 117.5 ns/op 8.509 Mops/s 83.97 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 6001443 205.7 ns/op 4.861 Mops/s 83.99 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 4249682 281.1 ns/op 3.558 Mops/s 83.93 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 13059571 93.59 ns/op 10.68 Mops/s 85.28 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 8234460 152.2 ns/op 6.570 Mops/s 85.27 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 5805838 211.7 ns/op 4.725 Mops/s 85.28 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 4077061 283.2 ns/op 3.531 Mops/s 85.28 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru 9140691 121.5 ns/op 8.232 Mops/s 88.45 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 12409273 91.19 ns/op 10.97 Mops/s 88.44 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 22329232 57.73 ns/op 17.32 Mops/s 88.43 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 33255928 34.92 ns/op 28.64 Mops/s 88.44 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq 9613018 127.0 ns/op 7.873 Mops/s 88.90 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 12548685 97.43 ns/op 10.26 Mops/s 89.03 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 19511572 59.61 ns/op 16.78 Mops/s 89.23 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 34055433 35.34 ns/op 28.30 Mops/s 89.38 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve 9770886 122.8 ns/op 8.141 Mops/s 89.73 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 17098390 67.45 ns/op 14.83 Mops/s 89.85 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 30380162 40.55 ns/op 24.66 Mops/s 89.99 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 44028885 23.72 ns/op 42.15 Mops/s 90.09 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 8334770 141.2 ns/op 7.082 Mops/s 89.85 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 15510663 80.06 ns/op 12.49 Mops/s 89.95 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 24550168 50.78 ns/op 19.69 Mops/s 90.06 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 41003620 27.71 ns/op 36.09 Mops/s 90.16 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 8199639 140.0 ns/op 7.145 Mops/s 89.89 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 15851444 82.01 ns/op 12.19 Mops/s 90.02 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 28130521 48.46 ns/op 20.64 Mops/s 90.23 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 41952723 26.24 ns/op 38.10 Mops/s 90.39 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter 5208066 230.1 ns/op 4.347 Mops/s 89.61 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-2 10134264 108.7 ns/op 9.199 Mops/s 89.62 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-4 16784527 71.18 ns/op 14.05 Mops/s 89.78 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-8 20501707 58.06 ns/op 17.22 Mops/s 89.81 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru 6987578 160.3 ns/op 6.237 Mops/s 88.43 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 4207616 281.4 ns/op 3.554 Mops/s 88.42 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 3684992 338.3 ns/op 2.956 Mops/s 88.42 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3102219 350.7 ns/op 2.851 Mops/s 88.42 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 5048350 261.7 ns/op 3.820 Mops/s 89.42 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 3034184 357.4 ns/op 2.798 Mops/s 89.43 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 3055050 415.9 ns/op 2.405 Mops/s 89.44 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2790744 405.2 ns/op 2.468 Mops/s 89.40 hit% 17 B/op 0 allocs/op PASS -ok github.com/floatdrop/evict/bench 441.339s +ok github.com/floatdrop/evict/bench 461.694s go: go1.27.3 golang-lru: v2.0.7 otter: v2.4.0 @@ -800,264 +800,264 @@ goos: darwin goarch: arm64 pkg: github.com/floatdrop/evict/bench cpu: Apple M3 Max -BenchmarkGet/cache=evict/lru 48089294 24.72 ns/op 40.45 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-2 47292192 25.42 ns/op 39.34 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-4 70585988 16.88 ns/op 59.23 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-8 35675353 33.49 ns/op 29.86 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq 56244506 21.42 ns/op 46.69 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-2 72389637 16.59 ns/op 60.27 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-4 100000000 10.25 ns/op 97.54 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-8 52887801 22.33 ns/op 44.78 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve 42118070 28.68 ns/op 34.87 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-2 84045136 14.22 ns/op 70.34 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-4 170947790 7.013 ns/op 142.6 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-8 318612336 3.763 ns/op 265.8 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo 43335117 27.66 ns/op 36.15 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-2 80843238 14.52 ns/op 68.89 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-4 100000000 10.07 ns/op 99.34 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-8 316863055 3.781 ns/op 264.5 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu 40038870 30.50 ns/op 32.79 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-2 81296912 14.54 ns/op 68.76 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-4 166145403 10.67 ns/op 93.71 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-8 276152001 4.342 ns/op 230.3 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter 32229870 37.56 ns/op 26.63 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-2 57722833 20.10 ns/op 49.75 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-4 120675859 9.960 ns/op 100.4 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-8 243076333 5.004 ns/op 199.9 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru 41474952 29.24 ns/op 34.20 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-2 14679258 83.86 ns/op 11.93 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-4 7743554 158.8 ns/op 6.298 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-8 5048359 230.0 ns/op 4.348 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q 39929734 30.49 ns/op 32.80 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-2 13927090 84.89 ns/op 11.78 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-4 7123598 169.2 ns/op 5.909 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-8 5411372 229.5 ns/op 4.357 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru 43237074 27.92 ns/op 35.82 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-2 43193563 27.79 ns/op 35.99 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-4 60090886 19.72 ns/op 50.72 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-8 30643383 40.15 ns/op 24.90 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq 51874226 22.89 ns/op 43.69 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-2 55308355 21.74 ns/op 46.00 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-4 73121316 18.20 ns/op 54.95 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-8 32886248 34.59 ns/op 28.91 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve 26337882 45.36 ns/op 22.05 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-2 22675539 53.59 ns/op 18.66 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-4 24386794 50.45 ns/op 19.82 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-8 15195843 86.46 ns/op 11.57 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo 24129939 47.56 ns/op 21.03 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-2 19233864 60.60 ns/op 16.50 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-4 22422624 51.24 ns/op 19.52 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-8 14652364 78.52 ns/op 12.73 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu 26994651 44.95 ns/op 22.25 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-2 20981511 57.80 ns/op 17.30 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-4 19273198 64.72 ns/op 15.45 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-8 15839832 77.93 ns/op 12.83 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=otter 10448379 116.4 ns/op 8.592 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-2 16104220 74.23 ns/op 13.47 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-4 25710979 46.80 ns/op 21.37 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-8 18920617 63.21 ns/op 15.82 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=golang-lru 38293950 31.62 ns/op 31.63 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-2 14019162 84.99 ns/op 11.77 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-4 7459641 162.0 ns/op 6.174 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-8 5236816 227.9 ns/op 4.387 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q 31847414 37.91 ns/op 26.38 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-2 13074452 94.52 ns/op 10.58 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-4 6648279 180.8 ns/op 5.532 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-8 5324186 231.6 ns/op 4.318 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru 44392172 27.28 ns/op 36.65 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-2 45426940 26.67 ns/op 37.49 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-4 70052710 17.20 ns/op 58.14 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-8 44336954 26.36 ns/op 37.93 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq 49886281 24.07 ns/op 41.55 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-2 69832738 17.64 ns/op 56.69 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-4 100000000 14.75 ns/op 67.77 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-8 57457389 20.82 ns/op 48.03 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve 39086197 30.56 ns/op 32.72 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-2 78315348 15.69 ns/op 63.74 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-4 138283411 8.406 ns/op 119.0 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-8 241341618 5.006 ns/op 199.8 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo 42927729 27.69 ns/op 36.11 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 80211892 14.81 ns/op 67.53 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 152840606 7.933 ns/op 126.1 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 221862517 4.621 ns/op 216.4 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu 36960938 29.72 ns/op 33.65 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 80199160 14.90 ns/op 67.14 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 146402844 8.785 ns/op 113.8 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 239110666 5.040 ns/op 198.4 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter 31282483 38.84 ns/op 25.75 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-2 58161958 20.66 ns/op 48.39 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-4 100000000 11.21 ns/op 89.17 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-8 212632197 5.673 ns/op 176.3 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru 39619377 29.63 ns/op 33.75 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-2 14765845 83.01 ns/op 12.05 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-4 7590600 165.3 ns/op 6.048 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-8 5066516 228.7 ns/op 4.372 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q 38033810 31.16 ns/op 32.09 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 14442685 85.97 ns/op 11.63 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 6987298 170.3 ns/op 5.873 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 5285878 226.9 ns/op 4.408 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru 45557653 26.59 ns/op 37.61 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-2 46112167 25.69 ns/op 38.92 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-4 71377765 16.96 ns/op 58.96 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-8 37262884 31.86 ns/op 31.38 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq 48323931 24.75 ns/op 40.41 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-2 69354808 17.33 ns/op 57.70 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-4 69051171 17.39 ns/op 57.50 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-8 50865777 23.41 ns/op 42.71 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve 39643320 30.14 ns/op 33.18 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-2 55710738 19.98 ns/op 50.05 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-4 100000000 12.74 ns/op 78.51 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-8 85169806 14.19 ns/op 70.49 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo 38133573 31.26 ns/op 31.99 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 64002559 18.80 ns/op 53.18 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 100000000 10.65 ns/op 93.93 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 81566994 14.73 ns/op 67.88 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu 39200740 31.28 ns/op 31.96 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 60337384 19.72 ns/op 50.71 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 83861392 12.16 ns/op 82.23 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 67002924 17.95 ns/op 55.72 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter 26343687 46.03 ns/op 21.73 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-2 47151429 26.67 ns/op 37.49 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-4 75683716 18.99 ns/op 52.67 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-8 89314788 12.43 ns/op 80.46 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru 40155938 29.89 ns/op 33.45 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-2 14517518 84.48 ns/op 11.84 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-4 7507117 159.4 ns/op 6.274 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-8 5578530 218.4 ns/op 4.578 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q 37839718 31.91 ns/op 31.34 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 13799612 88.99 ns/op 11.24 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 6877959 173.8 ns/op 5.754 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 5080792 224.7 ns/op 4.450 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru 44843887 27.41 ns/op 36.48 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-2 44227267 27.21 ns/op 36.75 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-4 61457698 19.04 ns/op 52.51 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-8 37922080 31.51 ns/op 31.74 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq 50932975 23.80 ns/op 42.02 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-2 63446606 18.89 ns/op 52.93 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-4 98821348 15.50 ns/op 64.52 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-8 43347315 27.79 ns/op 35.98 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve 36483451 32.80 ns/op 30.49 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-2 46088553 25.78 ns/op 38.79 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-4 61888368 18.92 ns/op 52.85 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-8 42692661 28.44 ns/op 35.16 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo 33050263 36.16 ns/op 27.66 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 46937568 25.19 ns/op 39.70 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 66286897 17.66 ns/op 56.64 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 43709542 27.03 ns/op 36.99 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu 34011516 35.27 ns/op 28.35 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 43509000 27.55 ns/op 36.30 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 61480527 21.05 ns/op 47.50 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 41981833 28.87 ns/op 34.64 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter 20391458 59.00 ns/op 16.95 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-2 34955952 34.81 ns/op 28.72 Mops/s 3 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-4 57875371 24.25 ns/op 41.24 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-8 53257196 21.61 ns/op 46.27 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru 39218569 30.73 ns/op 32.54 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-2 14499524 84.81 ns/op 11.79 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-4 7394265 159.6 ns/op 6.264 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-8 5358028 226.6 ns/op 4.413 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q 34886805 33.77 ns/op 29.61 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 13600488 88.51 ns/op 11.30 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 7080928 168.8 ns/op 5.926 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 5306125 220.6 ns/op 4.533 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru 19969490 61.26 ns/op 16.32 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-2 26631502 44.84 ns/op 22.30 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-4 43976582 27.55 ns/op 36.29 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-8 36482248 33.08 ns/op 30.23 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq 19940593 59.49 ns/op 16.81 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-2 27474177 43.05 ns/op 23.23 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-4 44525179 26.41 ns/op 37.86 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-8 37805148 32.34 ns/op 30.92 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve 15943021 75.23 ns/op 13.29 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-2 15171524 71.73 ns/op 13.94 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-4 21936688 55.87 ns/op 17.90 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-8 14550312 83.70 ns/op 11.95 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo 10105879 120.3 ns/op 8.313 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-2 13079434 91.61 ns/op 10.92 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-4 18402861 64.64 ns/op 15.47 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-8 12456838 95.45 ns/op 10.48 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu 9659149 123.9 ns/op 8.073 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-2 11810829 101.8 ns/op 9.820 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-4 16563956 69.66 ns/op 14.35 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-8 11941422 101.9 ns/op 9.812 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=otter 4506963 282.0 ns/op 3.547 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-2 7666845 165.4 ns/op 6.048 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-4 8233708 156.0 ns/op 6.410 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-8 7478686 168.5 ns/op 5.934 Mops/s 103 B/op 2 allocs/op -BenchmarkEvict/cache=golang-lru 8749916 136.1 ns/op 7.349 Mops/s 72 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-2 6683672 164.6 ns/op 6.076 Mops/s 72 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-4 5267962 235.2 ns/op 4.252 Mops/s 72 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-8 3964772 302.3 ns/op 3.308 Mops/s 72 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru/2q 4686639 269.0 ns/op 3.718 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-2 4476481 287.9 ns/op 3.474 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-4 3890258 336.2 ns/op 2.975 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-8 2875005 439.1 ns/op 2.277 Mops/s 122 B/op 1 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru 36134600 33.17 ns/op 30.15 Mops/s 83.98 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 41423173 29.49 ns/op 33.91 Mops/s 83.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 56846106 19.19 ns/op 52.12 Mops/s 83.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 43271049 29.33 ns/op 34.09 Mops/s 83.95 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq 36174860 31.95 ns/op 31.30 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 41377704 28.60 ns/op 34.97 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 64671723 18.54 ns/op 53.95 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 40276848 29.65 ns/op 33.73 Mops/s 85.54 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve 32381088 35.18 ns/op 28.42 Mops/s 87.72 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 49485214 23.85 ns/op 41.92 Mops/s 87.80 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 81651632 14.27 ns/op 70.06 Mops/s 87.83 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 59234029 19.28 ns/op 51.85 Mops/s 87.72 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 25910208 45.84 ns/op 21.82 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 42731998 28.15 ns/op 35.53 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 73368132 16.55 ns/op 60.44 Mops/s 86.77 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 50205003 23.22 ns/op 43.08 Mops/s 86.79 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 25912329 46.15 ns/op 21.67 Mops/s 88.05 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 40574637 29.25 ns/op 34.19 Mops/s 88.06 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 70046916 17.51 ns/op 57.12 Mops/s 88.06 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 52975063 21.85 ns/op 45.76 Mops/s 88.01 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter 15222316 79.80 ns/op 12.53 Mops/s 87.07 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-2 23878318 51.94 ns/op 19.25 Mops/s 86.90 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-4 42725455 28.72 ns/op 34.82 Mops/s 86.82 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-8 27728995 42.41 ns/op 23.58 Mops/s 87.38 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru 20296398 62.75 ns/op 15.94 Mops/s 83.96 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 10373604 116.6 ns/op 8.573 Mops/s 83.99 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 5818383 207.2 ns/op 4.826 Mops/s 83.96 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 4255458 277.9 ns/op 3.598 Mops/s 83.98 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 12516916 92.46 ns/op 10.82 Mops/s 85.29 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 7995093 152.9 ns/op 6.540 Mops/s 85.30 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 5698584 209.8 ns/op 4.766 Mops/s 85.33 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 4021311 289.8 ns/op 3.451 Mops/s 85.27 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru 10125915 113.2 ns/op 8.835 Mops/s 88.43 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 14991762 83.00 ns/op 12.05 Mops/s 88.42 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 20541920 51.63 ns/op 19.37 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 34800765 33.44 ns/op 29.91 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq 8858019 121.0 ns/op 8.267 Mops/s 88.89 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 13925925 89.06 ns/op 11.23 Mops/s 89.09 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 18350236 58.32 ns/op 17.15 Mops/s 89.20 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 33554308 35.43 ns/op 28.22 Mops/s 89.37 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve 8959338 122.2 ns/op 8.182 Mops/s 89.70 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 17287557 71.32 ns/op 14.02 Mops/s 89.85 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 32259184 39.17 ns/op 25.53 Mops/s 90.01 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 45310875 24.23 ns/op 41.28 Mops/s 90.09 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 8981511 138.5 ns/op 7.220 Mops/s 89.88 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 15358876 82.54 ns/op 12.11 Mops/s 89.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 25921728 46.65 ns/op 21.44 Mops/s 90.07 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 42061480 27.52 ns/op 36.34 Mops/s 90.17 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 8376631 134.6 ns/op 7.428 Mops/s 89.89 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 15649401 77.94 ns/op 12.83 Mops/s 90.40 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 28507568 42.83 ns/op 23.35 Mops/s 90.22 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 41335479 26.45 ns/op 37.81 Mops/s 90.38 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter 4923176 239.8 ns/op 4.170 Mops/s 89.58 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-2 9853756 118.5 ns/op 8.436 Mops/s 89.62 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-4 18069998 69.59 ns/op 14.37 Mops/s 89.78 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-8 20297856 57.49 ns/op 17.40 Mops/s 89.81 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru 7145605 160.9 ns/op 6.216 Mops/s 88.47 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 4156180 299.3 ns/op 3.341 Mops/s 88.44 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 3391465 342.7 ns/op 2.918 Mops/s 88.42 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3272029 339.0 ns/op 2.950 Mops/s 88.45 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 5148445 250.1 ns/op 3.998 Mops/s 89.40 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 3450577 349.7 ns/op 2.859 Mops/s 89.37 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 2811249 393.0 ns/op 2.544 Mops/s 89.39 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2880307 411.8 ns/op 2.428 Mops/s 89.41 hit% 17 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru 48298111 24.62 ns/op 40.61 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-2 48115395 24.97 ns/op 40.04 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-4 66995128 17.60 ns/op 56.83 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-8 44402440 27.56 ns/op 36.29 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq 53428316 22.50 ns/op 44.44 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-2 75071552 15.95 ns/op 62.68 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-4 100000000 11.35 ns/op 88.11 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-8 56736247 21.09 ns/op 47.42 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve 50960641 23.67 ns/op 42.25 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-2 91066041 12.87 ns/op 77.73 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-4 196004061 6.138 ns/op 162.9 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-8 396289464 3.032 ns/op 329.8 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo 52230589 23.13 ns/op 43.24 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-2 94810132 12.50 ns/op 80.03 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-4 184299688 6.524 ns/op 153.3 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-8 392866954 3.057 ns/op 327.1 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu 46872559 25.71 ns/op 38.90 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-2 90488067 13.04 ns/op 76.71 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-4 189992463 6.314 ns/op 158.4 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-8 377245494 3.184 ns/op 314.1 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter 32218620 36.61 ns/op 27.32 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-2 62229770 19.01 ns/op 52.60 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-4 124233853 9.620 ns/op 104.0 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-8 247872790 4.846 ns/op 206.4 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru 41801347 28.88 ns/op 34.63 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-2 14005459 85.64 ns/op 11.68 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-4 6928597 170.5 ns/op 5.866 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-8 5234992 240.3 ns/op 4.161 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q 39437197 30.34 ns/op 32.96 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-2 13754342 84.23 ns/op 11.87 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-4 7127506 170.9 ns/op 5.850 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-8 5383933 225.0 ns/op 4.445 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru 46029110 26.17 ns/op 38.21 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-2 44713483 27.13 ns/op 36.86 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-4 56212888 21.82 ns/op 45.83 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-8 30339357 40.09 ns/op 24.94 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq 52873917 22.99 ns/op 43.50 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-2 55930908 21.66 ns/op 46.16 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-4 72969398 16.89 ns/op 59.22 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-8 32615157 37.17 ns/op 26.90 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve 27555642 43.40 ns/op 23.04 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-2 22614111 54.58 ns/op 18.32 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-4 24831631 48.53 ns/op 20.60 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-8 16561755 71.85 ns/op 13.92 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo 28103757 42.12 ns/op 23.74 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-2 22543130 54.64 ns/op 18.30 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-4 19946683 51.32 ns/op 19.48 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-8 16941126 71.65 ns/op 13.96 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu 27486423 43.58 ns/op 22.95 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-2 20460153 58.21 ns/op 17.18 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-4 22775439 54.59 ns/op 18.32 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-8 14947077 79.19 ns/op 12.63 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=otter 10715157 113.2 ns/op 8.830 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-2 16749404 71.71 ns/op 13.95 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-4 24908043 46.71 ns/op 21.41 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-8 18698166 63.41 ns/op 15.77 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=golang-lru 39117944 31.08 ns/op 32.17 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-2 13918806 85.62 ns/op 11.68 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-4 6922500 172.9 ns/op 5.785 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-8 5213218 235.6 ns/op 4.244 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q 32344831 36.91 ns/op 27.09 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-2 12909992 92.71 ns/op 10.79 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-4 6637674 185.3 ns/op 5.397 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-8 4749352 249.3 ns/op 4.011 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru 46606918 24.52 ns/op 40.79 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-2 47572873 25.50 ns/op 39.21 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-4 57284478 19.29 ns/op 51.83 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-8 38411164 31.70 ns/op 31.55 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq 57269782 21.13 ns/op 47.33 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-2 73081606 17.84 ns/op 56.04 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-4 100000000 17.64 ns/op 56.69 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-8 56591870 21.19 ns/op 47.20 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve 49160431 25.24 ns/op 39.63 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-2 82727240 13.68 ns/op 73.10 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-4 160174759 7.462 ns/op 134.0 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-8 254833902 3.992 ns/op 250.5 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo 44906888 24.59 ns/op 40.67 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 94533468 13.13 ns/op 76.17 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 164925801 7.254 ns/op 137.9 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 220696808 5.052 ns/op 197.9 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu 39914736 25.87 ns/op 38.65 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 89568668 13.92 ns/op 71.86 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 100000000 10.91 ns/op 91.62 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 257555509 5.457 ns/op 183.2 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter 30472998 39.13 ns/op 25.55 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-2 58100125 21.49 ns/op 46.52 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-4 100000000 11.16 ns/op 89.58 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-8 213133886 5.642 ns/op 177.2 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru 41935618 29.28 ns/op 34.15 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-2 13496319 89.68 ns/op 11.15 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-4 6657909 191.5 ns/op 5.221 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-8 4851207 258.1 ns/op 3.875 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q 38671317 32.08 ns/op 31.17 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 13297558 89.85 ns/op 11.13 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 6939379 177.2 ns/op 5.644 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 4923224 245.5 ns/op 4.074 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru 48699157 24.84 ns/op 40.26 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-2 46375840 26.12 ns/op 38.28 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-4 59701370 22.95 ns/op 43.57 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-8 37779756 30.89 ns/op 32.38 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq 56932971 21.36 ns/op 46.81 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-2 69261238 17.80 ns/op 56.18 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-4 100000000 14.17 ns/op 70.58 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-8 46224070 25.72 ns/op 38.88 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve 42961604 28.26 ns/op 35.39 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-2 71185108 16.87 ns/op 59.27 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-4 100000000 14.47 ns/op 69.09 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-8 80773405 13.97 ns/op 71.59 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo 41672272 27.33 ns/op 36.58 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 66516081 20.65 ns/op 48.42 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 70948020 16.41 ns/op 60.92 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 77065929 15.69 ns/op 63.72 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu 42884328 28.96 ns/op 34.52 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 63659491 19.21 ns/op 52.04 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 100000000 11.57 ns/op 86.47 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 79927840 17.08 ns/op 58.54 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter 25940220 50.69 ns/op 19.73 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-2 45515965 28.05 ns/op 35.65 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-4 68893424 16.14 ns/op 61.94 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-8 94050638 12.36 ns/op 80.89 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru 39837770 30.00 ns/op 33.34 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-2 10676895 100.6 ns/op 9.939 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-4 6746558 185.2 ns/op 5.400 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-8 4779324 264.5 ns/op 3.780 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q 37084680 32.71 ns/op 30.57 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 13253931 87.16 ns/op 11.47 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 6735998 184.0 ns/op 5.435 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 4517922 261.4 ns/op 3.825 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru 47779258 25.50 ns/op 39.21 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-2 35108506 28.52 ns/op 35.07 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-4 58120760 19.32 ns/op 51.75 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-8 34168360 32.72 ns/op 30.56 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq 48725605 25.73 ns/op 38.87 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-2 65355621 22.38 ns/op 44.68 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-4 100000000 16.93 ns/op 59.08 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-8 42229110 27.12 ns/op 36.88 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve 35091052 32.24 ns/op 31.01 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-2 40516872 26.86 ns/op 37.22 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-4 48642813 23.15 ns/op 43.20 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-8 40490952 29.88 ns/op 33.47 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo 39795549 30.51 ns/op 32.77 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 35845192 28.88 ns/op 34.62 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 65932706 20.33 ns/op 49.19 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 43398656 28.68 ns/op 34.86 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu 39463677 32.79 ns/op 30.50 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 41225719 27.72 ns/op 36.07 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 64567618 18.96 ns/op 52.74 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 42196008 30.40 ns/op 32.90 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter 15525412 75.46 ns/op 13.25 Mops/s 3 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-2 28551950 35.55 ns/op 28.13 Mops/s 3 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-4 45997790 22.70 ns/op 44.05 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-8 53187266 21.56 ns/op 46.38 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru 38507358 31.44 ns/op 31.81 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-2 11599665 96.21 ns/op 10.39 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-4 7019196 177.9 ns/op 5.622 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-8 4796091 242.1 ns/op 4.130 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q 35411373 33.57 ns/op 29.79 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 13675453 93.07 ns/op 10.74 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 6703548 180.3 ns/op 5.545 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 5052348 249.1 ns/op 4.014 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru 20319796 56.88 ns/op 17.58 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-2 26379230 45.83 ns/op 21.82 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-4 47819638 27.00 ns/op 37.04 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-8 37290676 31.69 ns/op 31.55 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq 20225414 60.74 ns/op 16.46 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-2 24515040 46.10 ns/op 21.69 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-4 33809403 35.80 ns/op 27.94 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-8 35621432 34.50 ns/op 28.98 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve 15914353 69.43 ns/op 14.40 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-2 16379168 72.99 ns/op 13.70 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-4 22037184 62.02 ns/op 16.12 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-8 13850508 83.99 ns/op 11.91 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo 11392404 103.5 ns/op 9.660 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-2 14428719 90.11 ns/op 11.10 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-4 13600674 82.75 ns/op 12.08 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-8 11542137 103.4 ns/op 9.668 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu 9433448 127.1 ns/op 7.865 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-2 10155079 105.4 ns/op 9.488 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-4 14677192 76.97 ns/op 12.99 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-8 11655982 104.9 ns/op 9.536 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=otter 3882811 312.7 ns/op 3.198 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=otter-2 7437741 169.3 ns/op 5.908 Mops/s 104 B/op 2 allocs/op +BenchmarkEvict/cache=otter-4 7274296 177.5 ns/op 5.632 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=otter-8 6626810 205.3 ns/op 4.870 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=golang-lru 8444552 140.9 ns/op 7.095 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-2 6921038 180.4 ns/op 5.542 Mops/s 72 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-4 5014345 239.0 ns/op 4.184 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-8 3794101 314.7 ns/op 3.178 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru/2q 4392742 290.3 ns/op 3.445 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-2 4002034 327.0 ns/op 3.058 Mops/s 122 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-4 3452679 354.8 ns/op 2.818 Mops/s 122 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-8 3470817 380.2 ns/op 2.630 Mops/s 122 B/op 1 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru 38502364 31.69 ns/op 31.56 Mops/s 83.98 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 41594212 29.18 ns/op 34.27 Mops/s 83.98 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 66102346 18.75 ns/op 53.34 Mops/s 83.96 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 41092488 28.36 ns/op 35.26 Mops/s 83.96 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq 37996777 32.71 ns/op 30.57 Mops/s 85.56 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 40397974 29.96 ns/op 33.37 Mops/s 85.55 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 51601435 23.36 ns/op 42.80 Mops/s 85.56 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 43581556 27.89 ns/op 35.85 Mops/s 85.54 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve 37275279 31.82 ns/op 31.43 Mops/s 87.75 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 53266652 23.00 ns/op 43.48 Mops/s 87.86 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 81680577 16.10 ns/op 62.11 Mops/s 87.80 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 63324814 18.13 ns/op 55.15 Mops/s 87.72 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 28133323 41.79 ns/op 23.93 Mops/s 86.77 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 45441850 26.47 ns/op 37.77 Mops/s 86.78 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 61538856 17.37 ns/op 57.56 Mops/s 86.78 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 51250567 23.11 ns/op 43.27 Mops/s 86.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 24642744 44.57 ns/op 22.43 Mops/s 88.04 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 42981674 29.89 ns/op 33.45 Mops/s 88.03 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 65133679 17.33 ns/op 57.69 Mops/s 88.05 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 54317178 21.64 ns/op 46.22 Mops/s 88.04 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter 14874280 89.77 ns/op 11.14 Mops/s 87.09 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-2 19182223 55.96 ns/op 17.87 Mops/s 86.56 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-4 37819125 28.61 ns/op 34.95 Mops/s 87.75 hit% 13 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-8 27616891 42.74 ns/op 23.40 Mops/s 87.61 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru 18819740 61.65 ns/op 16.22 Mops/s 83.97 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 10252006 118.6 ns/op 8.429 Mops/s 83.99 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 5806844 212.9 ns/op 4.697 Mops/s 83.96 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 4230625 291.6 ns/op 3.429 Mops/s 83.95 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 12563997 104.4 ns/op 9.578 Mops/s 85.28 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 8155447 159.0 ns/op 6.287 Mops/s 85.27 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 5756775 208.8 ns/op 4.790 Mops/s 85.26 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 4286413 273.5 ns/op 3.656 Mops/s 85.27 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru 9033292 121.1 ns/op 8.256 Mops/s 88.44 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 13740241 108.3 ns/op 9.237 Mops/s 88.44 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 23186444 58.76 ns/op 17.02 Mops/s 88.44 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 33554114 35.67 ns/op 28.04 Mops/s 88.42 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq 9311892 127.5 ns/op 7.843 Mops/s 88.92 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 13353486 97.67 ns/op 10.24 Mops/s 89.07 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 16610518 72.87 ns/op 13.72 Mops/s 89.17 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 33648594 36.59 ns/op 27.33 Mops/s 89.38 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve 9499087 136.6 ns/op 7.318 Mops/s 89.96 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 15994197 80.66 ns/op 12.40 Mops/s 89.84 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 32350534 49.88 ns/op 20.05 Mops/s 90.01 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 46884843 24.33 ns/op 41.11 Mops/s 90.11 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 8502750 140.6 ns/op 7.111 Mops/s 89.84 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 13148594 85.47 ns/op 11.70 Mops/s 89.92 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 24779863 52.48 ns/op 19.05 Mops/s 90.06 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 38462360 29.04 ns/op 34.43 Mops/s 90.14 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 7770458 137.3 ns/op 7.286 Mops/s 89.84 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 15030750 95.51 ns/op 10.47 Mops/s 90.02 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 25037750 50.76 ns/op 19.70 Mops/s 90.65 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 42255938 26.82 ns/op 37.29 Mops/s 90.39 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter 4466431 247.8 ns/op 4.036 Mops/s 89.55 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-2 9238657 111.0 ns/op 9.009 Mops/s 89.60 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-4 14716800 76.91 ns/op 13.00 Mops/s 89.72 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-8 19597155 57.85 ns/op 17.29 Mops/s 89.81 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru 5457177 217.3 ns/op 4.603 Mops/s 88.44 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 3352545 329.6 ns/op 3.034 Mops/s 88.41 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 2727858 426.1 ns/op 2.347 Mops/s 88.42 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3193580 373.3 ns/op 2.679 Mops/s 88.44 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 4617874 271.1 ns/op 3.689 Mops/s 89.41 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 3016080 392.4 ns/op 2.548 Mops/s 89.44 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 3022404 409.2 ns/op 2.444 Mops/s 89.42 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2556909 452.7 ns/op 2.209 Mops/s 89.42 hit% 17 B/op 0 allocs/op PASS -ok github.com/floatdrop/evict/bench 446.519s +ok github.com/floatdrop/evict/bench 466.446s go: go1.27.3 golang-lru: v2.0.7 otter: v2.4.0 @@ -1065,261 +1065,261 @@ goos: darwin goarch: arm64 pkg: github.com/floatdrop/evict/bench cpu: Apple M3 Max -BenchmarkGet/cache=evict/lru 47964369 25.21 ns/op 39.67 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-2 47394924 25.68 ns/op 38.94 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-4 57116678 19.48 ns/op 51.34 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/lru-8 43424896 26.41 ns/op 37.87 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq 54680913 21.71 ns/op 46.07 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-2 70473715 16.91 ns/op 59.12 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-4 100000000 10.53 ns/op 94.98 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/twoq-8 48586764 24.43 ns/op 40.94 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve 44271390 27.10 ns/op 36.90 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-2 83960118 14.07 ns/op 71.05 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-4 172582004 6.946 ns/op 144.0 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/sieve-8 265974860 3.792 ns/op 263.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo 43263639 27.55 ns/op 36.30 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-2 85211640 14.11 ns/op 70.85 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-4 166725202 7.154 ns/op 139.8 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/s3fifo-8 326076360 3.672 ns/op 272.3 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu 42104030 28.01 ns/op 35.70 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-2 79553834 14.61 ns/op 68.45 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-4 167823736 7.140 ns/op 140.1 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=evict/tinylfu-8 309506091 3.874 ns/op 258.1 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter 31858688 36.72 ns/op 27.24 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-2 58201570 19.62 ns/op 50.96 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-4 126216796 9.528 ns/op 105.0 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=otter-8 246256936 4.874 ns/op 205.2 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru 40326588 29.72 ns/op 33.65 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-2 13913634 86.37 ns/op 11.58 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-4 7104008 169.9 ns/op 5.887 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru-8 5118586 229.9 ns/op 4.350 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q 40193373 30.20 ns/op 33.12 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-2 14160460 84.56 ns/op 11.83 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-4 7034431 167.9 ns/op 5.955 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkGet/cache=golang-lru/2q-8 5237364 229.6 ns/op 4.355 Mops/s 100.0 hit% 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru 44523734 27.19 ns/op 36.78 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-2 42439316 28.37 ns/op 35.25 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-4 59210402 19.77 ns/op 50.58 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/lru-8 32317682 38.03 ns/op 26.30 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq 48886806 24.95 ns/op 40.09 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-2 53868225 22.05 ns/op 45.35 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-4 66427711 18.22 ns/op 54.89 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/twoq-8 33164019 36.04 ns/op 27.75 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve 26849166 44.33 ns/op 22.56 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-2 22481733 53.71 ns/op 18.62 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-4 24290206 49.56 ns/op 20.18 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/sieve-8 17059761 71.84 ns/op 13.92 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo 27240636 44.43 ns/op 22.51 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-2 23256658 51.46 ns/op 19.43 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-4 26422429 45.82 ns/op 21.82 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/s3fifo-8 16522050 74.19 ns/op 13.48 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu 26915233 44.65 ns/op 22.40 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-2 20763040 58.65 ns/op 17.05 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-4 20225968 58.87 ns/op 16.99 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=evict/tinylfu-8 13248206 90.74 ns/op 11.02 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=otter 10562829 113.4 ns/op 8.817 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-2 16830402 70.30 ns/op 14.22 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-4 24612859 47.04 ns/op 21.26 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=otter-8 19108634 63.31 ns/op 15.80 Mops/s 16 B/op 1 allocs/op -BenchmarkSet/cache=golang-lru 39115766 31.23 ns/op 32.02 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-2 13894825 85.77 ns/op 11.66 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-4 6972758 173.7 ns/op 5.756 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru-8 5179372 236.3 ns/op 4.232 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q 32579738 37.40 ns/op 26.74 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-2 13242255 90.48 ns/op 11.05 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-4 6731097 177.3 ns/op 5.639 Mops/s 0 B/op 0 allocs/op -BenchmarkSet/cache=golang-lru/2q-8 5087116 233.6 ns/op 4.280 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru 46446891 25.69 ns/op 38.92 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-2 45387423 26.57 ns/op 37.64 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-4 74431297 16.62 ns/op 60.18 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/lru-8 41649373 28.20 ns/op 35.46 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq 57580650 21.24 ns/op 47.08 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-2 71934898 17.11 ns/op 58.46 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-4 100000000 13.86 ns/op 72.14 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/twoq-8 56751004 21.43 ns/op 46.65 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve 41204781 29.11 ns/op 34.35 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-2 74868979 16.12 ns/op 62.02 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-4 147461209 7.918 ns/op 126.3 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/sieve-8 231921180 5.161 ns/op 193.8 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo 41517762 28.80 ns/op 34.72 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 77534404 15.56 ns/op 64.28 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 148742436 8.042 ns/op 124.4 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 260382362 4.568 ns/op 218.9 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu 39883009 30.78 ns/op 32.48 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 63791047 15.75 ns/op 63.49 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 139330363 8.507 ns/op 117.5 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 196429993 5.876 ns/op 170.2 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter 32011381 37.99 ns/op 26.33 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-2 58736550 20.44 ns/op 48.92 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-4 100000000 11.00 ns/op 90.93 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=otter-8 209885964 5.713 ns/op 175.0 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru 41056402 29.56 ns/op 33.83 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-2 13610109 85.54 ns/op 11.69 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-4 7082138 170.1 ns/op 5.880 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru-8 5124248 221.0 ns/op 4.525 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q 38313870 31.28 ns/op 31.97 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 14181134 84.95 ns/op 11.77 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 6895976 172.7 ns/op 5.790 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 5086543 232.2 ns/op 4.307 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru 41192288 28.67 ns/op 34.88 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-2 47294290 25.66 ns/op 38.97 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-4 71769080 16.81 ns/op 59.50 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/lru-8 42818784 28.26 ns/op 35.39 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq 52661221 22.83 ns/op 43.81 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-2 59731830 17.37 ns/op 57.57 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-4 93140644 11.72 ns/op 85.30 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/twoq-8 52210326 23.15 ns/op 43.20 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve 37064348 32.31 ns/op 30.95 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-2 38277103 31.48 ns/op 31.77 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-4 89334462 11.51 ns/op 86.90 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/sieve-8 76234240 15.62 ns/op 64.03 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo 38559687 31.31 ns/op 31.94 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 65707666 18.30 ns/op 54.66 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 100000000 10.84 ns/op 92.25 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 84481756 14.31 ns/op 69.87 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu 39472927 30.19 ns/op 33.12 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 36030400 33.33 ns/op 30.01 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 85624837 12.53 ns/op 79.79 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 77919547 15.87 ns/op 63.03 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter 26795931 45.39 ns/op 22.03 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-2 45795118 27.63 ns/op 36.20 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-4 84663549 15.24 ns/op 65.60 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=otter-8 85955266 12.37 ns/op 80.85 Mops/s 1 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru 40448188 29.54 ns/op 33.86 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-2 13821261 87.89 ns/op 11.38 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-4 6976082 168.5 ns/op 5.934 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru-8 5385603 225.6 ns/op 4.432 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q 37320153 31.82 ns/op 31.43 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 13891929 85.07 ns/op 11.75 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 7165436 170.9 ns/op 5.851 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 5114235 221.7 ns/op 4.510 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru 43585843 27.64 ns/op 36.18 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-2 45615957 26.38 ns/op 37.90 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-4 68578286 17.22 ns/op 58.09 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/lru-8 35748109 33.19 ns/op 30.13 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq 48405312 22.96 ns/op 43.55 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-2 64086302 18.80 ns/op 53.20 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-4 99640530 13.23 ns/op 75.57 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/twoq-8 45825502 25.89 ns/op 38.62 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve 35522401 33.81 ns/op 29.58 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-2 47029237 25.84 ns/op 38.70 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-4 61120412 18.20 ns/op 54.96 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/sieve-8 43817876 27.71 ns/op 36.08 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo 33800714 35.50 ns/op 28.17 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 49100840 24.76 ns/op 40.38 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 75124226 16.98 ns/op 58.88 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 40866423 29.58 ns/op 33.81 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu 32126398 38.13 ns/op 26.23 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 41506034 27.57 ns/op 36.27 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 60582986 21.76 ns/op 45.95 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 39979177 29.13 ns/op 34.33 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter 20893864 59.05 ns/op 16.93 Mops/s 3 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-2 34334845 34.91 ns/op 28.65 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-4 59111238 21.73 ns/op 46.03 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=otter-8 53592961 21.42 ns/op 46.68 Mops/s 4 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru 39461406 30.49 ns/op 32.79 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-2 14157684 86.76 ns/op 11.53 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-4 6976239 173.7 ns/op 5.757 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru-8 5354362 228.8 ns/op 4.370 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q 35687024 33.72 ns/op 29.65 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 13341189 87.62 ns/op 11.41 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 7227259 168.7 ns/op 5.927 Mops/s 0 B/op 0 allocs/op -BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 4966536 228.6 ns/op 4.375 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru 19314016 61.51 ns/op 16.26 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-2 26562898 44.87 ns/op 22.29 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-4 43000478 28.69 ns/op 34.86 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/lru-8 37204159 31.91 ns/op 31.34 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq 20126277 59.62 ns/op 16.77 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-2 28116762 42.32 ns/op 23.63 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-4 45728221 27.08 ns/op 36.93 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/twoq-8 36393411 32.91 ns/op 30.38 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve 16092289 75.26 ns/op 13.29 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-2 16964026 72.70 ns/op 13.76 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-4 20979998 53.42 ns/op 18.72 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/sieve-8 14342821 84.32 ns/op 11.86 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo 10332542 117.2 ns/op 8.529 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-2 13366408 91.31 ns/op 10.95 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-4 18536850 63.74 ns/op 15.69 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/s3fifo-8 12525387 96.32 ns/op 10.38 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu 9869262 123.9 ns/op 8.074 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-2 11456995 100.5 ns/op 9.954 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-4 17204392 72.04 ns/op 13.88 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=evict/tinylfu-8 11830444 102.7 ns/op 9.733 Mops/s 0 B/op 0 allocs/op -BenchmarkEvict/cache=otter 4488320 281.4 ns/op 3.554 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-2 7649210 164.1 ns/op 6.095 Mops/s 103 B/op 2 allocs/op -BenchmarkEvict/cache=otter-4 8069043 152.7 ns/op 6.549 Mops/s 104 B/op 2 allocs/op -BenchmarkEvict/cache=otter-8 7890187 178.4 ns/op 5.605 Mops/s 103 B/op 2 allocs/op -BenchmarkEvict/cache=golang-lru 8957479 135.2 ns/op 7.394 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-2 7339116 166.3 ns/op 6.012 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-4 5153202 229.0 ns/op 4.366 Mops/s 71 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru-8 3953287 302.6 ns/op 3.304 Mops/s 72 B/op 0 allocs/op -BenchmarkEvict/cache=golang-lru/2q 4691715 268.9 ns/op 3.718 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-2 4470706 296.0 ns/op 3.379 Mops/s 122 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-4 3722031 334.8 ns/op 2.987 Mops/s 123 B/op 1 allocs/op -BenchmarkEvict/cache=golang-lru/2q-8 2930943 437.0 ns/op 2.288 Mops/s 122 B/op 1 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru 36352069 33.00 ns/op 30.30 Mops/s 83.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 41404174 29.09 ns/op 34.37 Mops/s 83.98 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 65406084 18.44 ns/op 54.24 Mops/s 83.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 42848596 25.96 ns/op 38.52 Mops/s 83.97 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq 38855698 30.93 ns/op 32.34 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 42398269 28.80 ns/op 34.72 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 67324641 17.97 ns/op 55.64 Mops/s 85.56 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 43680373 28.59 ns/op 34.98 Mops/s 85.55 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve 33580090 35.34 ns/op 28.30 Mops/s 87.77 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 49113399 23.92 ns/op 41.80 Mops/s 87.82 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 81540434 15.14 ns/op 66.05 Mops/s 87.80 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 59472428 19.09 ns/op 52.38 Mops/s 87.72 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 26541429 46.10 ns/op 21.69 Mops/s 86.76 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 41716458 29.17 ns/op 34.28 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 74455930 16.66 ns/op 60.03 Mops/s 86.78 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 50831215 23.46 ns/op 42.63 Mops/s 86.79 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 26092486 46.23 ns/op 21.63 Mops/s 88.00 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 40545906 29.33 ns/op 34.10 Mops/s 88.03 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 69848152 17.06 ns/op 58.62 Mops/s 88.04 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 54650509 21.91 ns/op 45.65 Mops/s 88.03 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter 13194321 80.30 ns/op 12.45 Mops/s 87.04 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-2 24043920 53.69 ns/op 18.62 Mops/s 86.63 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-4 37281118 27.47 ns/op 36.40 Mops/s 87.57 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=otter-8 28706274 42.44 ns/op 23.57 Mops/s 87.60 hit% 14 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru 19871401 59.77 ns/op 16.73 Mops/s 83.96 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 10815332 116.1 ns/op 8.611 Mops/s 84.00 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 5890402 210.4 ns/op 4.752 Mops/s 83.96 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 4259908 285.2 ns/op 3.506 Mops/s 83.99 hit% 15 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 13193517 94.30 ns/op 10.60 Mops/s 85.28 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 8034148 148.7 ns/op 6.727 Mops/s 85.29 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 5961288 203.0 ns/op 4.927 Mops/s 85.32 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 4058040 289.5 ns/op 3.454 Mops/s 85.28 hit% 23 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru 9378037 118.5 ns/op 8.440 Mops/s 88.43 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 14686653 76.84 ns/op 13.01 Mops/s 88.42 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 19756947 51.68 ns/op 19.35 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 34805601 35.06 ns/op 28.52 Mops/s 88.44 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq 9501170 125.8 ns/op 7.947 Mops/s 89.41 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 12690410 92.75 ns/op 10.78 Mops/s 89.04 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 22559871 57.57 ns/op 17.37 Mops/s 89.28 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 35161357 35.27 ns/op 28.35 Mops/s 89.38 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve 10329580 125.2 ns/op 7.986 Mops/s 89.72 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 17933521 64.24 ns/op 15.57 Mops/s 90.14 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 26880238 39.35 ns/op 25.41 Mops/s 89.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 45318361 24.25 ns/op 41.24 Mops/s 90.09 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 7040914 148.9 ns/op 6.715 Mops/s 89.83 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 15501405 85.53 ns/op 11.69 Mops/s 89.96 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 28496004 48.01 ns/op 20.83 Mops/s 90.08 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 43520440 27.15 ns/op 36.84 Mops/s 90.18 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 8176651 133.3 ns/op 7.499 Mops/s 89.86 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 16084317 73.68 ns/op 13.57 Mops/s 90.02 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 23089984 51.93 ns/op 19.26 Mops/s 90.14 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 43209310 26.45 ns/op 37.80 Mops/s 90.40 hit% 0 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter 4862700 231.2 ns/op 4.325 Mops/s 89.58 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-2 10317536 112.9 ns/op 8.855 Mops/s 89.68 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-4 15576829 64.85 ns/op 15.42 Mops/s 89.75 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=otter-8 23436374 53.37 ns/op 18.74 Mops/s 89.85 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru 7400587 158.4 ns/op 6.314 Mops/s 88.44 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 4246656 300.9 ns/op 3.323 Mops/s 88.45 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 3265851 325.4 ns/op 3.074 Mops/s 88.44 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3329877 347.4 ns/op 2.879 Mops/s 88.43 hit% 11 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 4601932 245.7 ns/op 4.069 Mops/s 89.41 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 3319974 365.1 ns/op 2.739 Mops/s 89.42 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 3000418 411.0 ns/op 2.433 Mops/s 89.39 hit% 17 B/op 0 allocs/op -BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2830532 417.6 ns/op 2.395 Mops/s 89.42 hit% 17 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru 49713249 23.48 ns/op 42.59 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-2 44794155 27.27 ns/op 36.67 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-4 66883725 17.13 ns/op 58.37 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/lru-8 33951414 36.66 ns/op 27.28 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq 64579204 19.51 ns/op 51.26 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-2 73540113 17.30 ns/op 57.82 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-4 99926437 12.78 ns/op 78.23 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/twoq-8 57627082 21.91 ns/op 45.65 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve 48739209 24.69 ns/op 40.50 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-2 94273534 12.69 ns/op 78.77 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-4 191898306 6.272 ns/op 159.4 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/sieve-8 384109701 3.147 ns/op 317.8 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo 45080932 25.67 ns/op 38.96 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-2 96373605 12.05 ns/op 82.98 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-4 193357038 9.312 ns/op 107.4 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/s3fifo-8 384045573 3.176 ns/op 314.8 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu 48158440 24.72 ns/op 40.45 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-2 86065975 13.54 ns/op 73.87 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-4 193169658 6.215 ns/op 160.9 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=evict/tinylfu-8 356526672 3.348 ns/op 298.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter 31954233 38.60 ns/op 25.91 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-2 59505729 19.01 ns/op 52.61 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-4 124993065 9.518 ns/op 105.1 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=otter-8 246369745 4.885 ns/op 204.7 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru 40643005 30.19 ns/op 33.13 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-2 13641511 88.93 ns/op 11.24 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-4 6831357 173.8 ns/op 5.754 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru-8 5095702 240.9 ns/op 4.150 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q 40319080 30.64 ns/op 32.64 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-2 13375776 89.75 ns/op 11.14 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-4 7062526 171.6 ns/op 5.829 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkGet/cache=golang-lru/2q-8 5278483 252.0 ns/op 3.968 Mops/s 100.0 hit% 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru 47189596 25.46 ns/op 39.28 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-2 44282214 27.72 ns/op 36.07 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-4 55587080 21.41 ns/op 46.72 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/lru-8 31825665 38.20 ns/op 26.18 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq 51067179 23.47 ns/op 42.60 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-2 53633283 22.52 ns/op 44.41 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-4 72098230 15.71 ns/op 63.64 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/twoq-8 32238024 36.42 ns/op 27.46 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve 27571258 45.71 ns/op 21.88 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-2 22793230 57.27 ns/op 17.46 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-4 22903928 55.25 ns/op 18.10 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/sieve-8 14200560 80.97 ns/op 12.35 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo 24535882 44.70 ns/op 22.37 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-2 21912004 53.05 ns/op 18.85 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-4 22116384 51.73 ns/op 19.33 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/s3fifo-8 15541281 76.60 ns/op 13.05 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu 27383011 43.42 ns/op 23.03 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-2 20622040 62.49 ns/op 16.00 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-4 20573706 56.63 ns/op 17.66 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=evict/tinylfu-8 14627352 86.58 ns/op 11.55 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=otter 9055076 113.8 ns/op 8.786 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-2 16907192 69.76 ns/op 14.33 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-4 26505034 49.85 ns/op 20.06 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=otter-8 19165081 63.06 ns/op 15.86 Mops/s 16 B/op 1 allocs/op +BenchmarkSet/cache=golang-lru 38444647 31.47 ns/op 31.78 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-2 12497146 90.72 ns/op 11.02 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-4 6425410 179.1 ns/op 5.582 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru-8 4626946 277.7 ns/op 3.601 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q 27860973 39.06 ns/op 25.60 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-2 11885335 96.83 ns/op 10.33 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-4 6885592 188.9 ns/op 5.294 Mops/s 0 B/op 0 allocs/op +BenchmarkSet/cache=golang-lru/2q-8 4550785 253.8 ns/op 3.940 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru 49311015 23.90 ns/op 41.85 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-2 48401083 25.17 ns/op 39.73 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-4 69819026 19.95 ns/op 50.14 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/lru-8 38972847 30.26 ns/op 33.05 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq 58767596 21.14 ns/op 47.30 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-2 70776975 22.45 ns/op 44.54 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-4 86632953 16.17 ns/op 61.83 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/twoq-8 53055283 21.81 ns/op 45.85 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve 43709808 24.34 ns/op 41.08 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-2 91595186 13.44 ns/op 74.41 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-4 170121099 7.199 ns/op 138.9 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/sieve-8 302907915 4.056 ns/op 246.5 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo 49284855 26.63 ns/op 37.55 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-2 82738408 13.77 ns/op 72.60 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-4 166093460 7.531 ns/op 132.8 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/s3fifo-8 298187886 4.080 ns/op 245.1 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu 42673304 25.51 ns/op 39.20 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-2 86045152 14.80 ns/op 67.55 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-4 156517995 7.729 ns/op 129.4 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=evict/tinylfu-8 279415923 4.215 ns/op 237.3 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter 31050742 40.59 ns/op 24.64 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-2 54969594 20.88 ns/op 47.90 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-4 100000000 10.88 ns/op 91.94 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=otter-8 212923210 5.630 ns/op 177.6 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru 37914292 30.31 ns/op 32.99 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-2 13640270 87.72 ns/op 11.40 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-4 7106280 172.3 ns/op 5.803 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru-8 4835538 245.5 ns/op 4.074 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q 38959035 30.63 ns/op 32.64 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-2 13015525 89.34 ns/op 11.19 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-4 6050654 178.1 ns/op 5.616 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=1%/cache=golang-lru/2q-8 5070549 243.4 ns/op 4.108 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru 50533141 24.14 ns/op 41.43 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-2 46885224 25.96 ns/op 38.53 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-4 70632590 20.67 ns/op 48.38 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/lru-8 33273332 36.16 ns/op 27.65 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq 49465071 20.90 ns/op 47.86 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-2 67109870 18.33 ns/op 54.55 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-4 103652144 11.79 ns/op 84.83 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/twoq-8 50550349 24.18 ns/op 41.36 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve 44714803 27.47 ns/op 36.40 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-2 69103362 21.71 ns/op 46.07 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-4 94118569 13.08 ns/op 76.43 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/sieve-8 85856101 13.92 ns/op 71.85 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo 45764479 26.74 ns/op 37.40 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-2 70667906 17.98 ns/op 55.62 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-4 80434570 13.07 ns/op 76.51 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/s3fifo-8 85415076 13.73 ns/op 72.84 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu 42452829 28.35 ns/op 35.27 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-2 67887702 18.33 ns/op 54.56 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-4 93397933 14.97 ns/op 66.81 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=evict/tinylfu-8 75000974 15.76 ns/op 63.44 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter 24815328 57.34 ns/op 17.44 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-2 40342801 31.51 ns/op 31.74 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-4 61367211 19.61 ns/op 50.99 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=otter-8 91952845 12.24 ns/op 81.67 Mops/s 1 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru 38157015 30.48 ns/op 32.81 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-2 13526937 89.30 ns/op 11.20 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-4 6155710 174.1 ns/op 5.745 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru-8 4927292 239.1 ns/op 4.183 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q 37969977 32.15 ns/op 31.10 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-2 12088928 92.83 ns/op 10.77 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-4 6752515 178.1 ns/op 5.615 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=10%/cache=golang-lru/2q-8 4949577 228.7 ns/op 4.372 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru 44165480 26.90 ns/op 37.17 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-2 47038993 25.97 ns/op 38.51 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-4 61843447 18.89 ns/op 52.93 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/lru-8 39522219 29.99 ns/op 33.35 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq 48814386 24.57 ns/op 40.70 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-2 65200852 18.76 ns/op 53.30 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-4 88069082 13.16 ns/op 76.00 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/twoq-8 47936564 26.19 ns/op 38.18 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve 39956713 30.11 ns/op 33.21 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-2 50006770 24.18 ns/op 41.36 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-4 66725203 18.34 ns/op 54.53 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/sieve-8 43235452 28.01 ns/op 35.70 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo 40952660 29.99 ns/op 33.34 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-2 41669620 26.52 ns/op 37.71 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-4 62144098 18.56 ns/op 53.87 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/s3fifo-8 41782729 29.05 ns/op 34.42 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu 38049840 31.83 ns/op 31.42 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-2 46475674 31.50 ns/op 31.74 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-4 49092638 21.47 ns/op 46.57 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=evict/tinylfu-8 39880911 30.41 ns/op 32.88 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter 16684934 71.05 ns/op 14.07 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-2 34638074 34.93 ns/op 28.63 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-4 47520123 24.73 ns/op 40.44 Mops/s 3 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=otter-8 53452810 21.47 ns/op 46.58 Mops/s 4 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru 38669810 30.66 ns/op 32.62 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-2 11692658 90.92 ns/op 11.00 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-4 6897476 173.7 ns/op 5.756 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru-8 5207823 247.9 ns/op 4.035 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q 34501801 37.00 ns/op 27.03 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-2 13247286 90.21 ns/op 11.09 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-4 7008453 177.0 ns/op 5.648 Mops/s 0 B/op 0 allocs/op +BenchmarkMixed/writes=25%/cache=golang-lru/2q-8 5135175 244.3 ns/op 4.093 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru 21882452 55.82 ns/op 17.92 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-2 29820609 40.73 ns/op 24.55 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-4 42310132 27.63 ns/op 36.19 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/lru-8 36295626 30.17 ns/op 33.15 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq 19837429 61.37 ns/op 16.30 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-2 26324328 43.98 ns/op 22.74 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-4 41249516 29.74 ns/op 33.63 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/twoq-8 37058959 32.55 ns/op 30.72 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve 16928947 69.12 ns/op 14.47 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-2 17186877 70.51 ns/op 14.18 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-4 23171464 60.82 ns/op 16.44 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/sieve-8 14378912 83.83 ns/op 11.93 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo 11001813 108.4 ns/op 9.224 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-2 13663755 90.70 ns/op 11.03 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-4 18469944 66.22 ns/op 15.10 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/s3fifo-8 12409924 98.31 ns/op 10.17 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu 10129321 119.7 ns/op 8.357 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-2 10719848 99.98 ns/op 10.00 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-4 15310507 73.57 ns/op 13.59 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=evict/tinylfu-8 11480007 107.8 ns/op 9.274 Mops/s 0 B/op 0 allocs/op +BenchmarkEvict/cache=otter 3910488 330.7 ns/op 3.024 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=otter-2 7218015 190.2 ns/op 5.259 Mops/s 102 B/op 2 allocs/op +BenchmarkEvict/cache=otter-4 6581434 175.5 ns/op 5.697 Mops/s 105 B/op 2 allocs/op +BenchmarkEvict/cache=otter-8 6102362 201.9 ns/op 4.954 Mops/s 103 B/op 2 allocs/op +BenchmarkEvict/cache=golang-lru 8536772 144.8 ns/op 6.904 Mops/s 72 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-2 6669354 187.5 ns/op 5.332 Mops/s 72 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-4 5088266 249.1 ns/op 4.015 Mops/s 71 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru-8 3672639 316.1 ns/op 3.164 Mops/s 72 B/op 0 allocs/op +BenchmarkEvict/cache=golang-lru/2q 4266480 297.7 ns/op 3.359 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-2 4174710 328.6 ns/op 3.043 Mops/s 122 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-4 3489878 373.2 ns/op 2.680 Mops/s 123 B/op 1 allocs/op +BenchmarkEvict/cache=golang-lru/2q-8 2783809 446.3 ns/op 2.241 Mops/s 122 B/op 1 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru 37250836 31.99 ns/op 31.26 Mops/s 83.97 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-2 38456145 29.39 ns/op 34.02 Mops/s 83.97 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-4 59398588 19.18 ns/op 52.13 Mops/s 83.96 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/lru-8 41951318 29.82 ns/op 33.54 Mops/s 83.94 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq 37290386 35.64 ns/op 28.06 Mops/s 85.57 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-2 40268118 31.57 ns/op 31.67 Mops/s 85.55 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-4 52296030 22.74 ns/op 43.97 Mops/s 85.56 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/twoq-8 42137296 29.06 ns/op 34.42 Mops/s 85.54 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve 36800548 33.53 ns/op 29.83 Mops/s 87.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-2 52565102 24.61 ns/op 40.63 Mops/s 87.85 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-4 55840249 20.58 ns/op 48.60 Mops/s 87.78 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/sieve-8 59167342 18.52 ns/op 54.00 Mops/s 87.69 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo 28710223 43.26 ns/op 23.12 Mops/s 86.77 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-2 44619133 27.56 ns/op 36.29 Mops/s 86.78 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-4 54966026 19.46 ns/op 51.38 Mops/s 86.78 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/s3fifo-8 51774535 23.69 ns/op 42.21 Mops/s 86.79 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu 24619290 43.56 ns/op 22.96 Mops/s 88.05 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-2 41792821 28.34 ns/op 35.28 Mops/s 88.09 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-4 63598342 19.85 ns/op 50.38 Mops/s 88.04 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=evict/tinylfu-8 55325779 21.72 ns/op 46.05 Mops/s 88.02 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter 10868408 106.9 ns/op 9.355 Mops/s 86.99 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-2 21097154 65.48 ns/op 15.27 Mops/s 86.49 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-4 30871706 40.12 ns/op 24.93 Mops/s 87.71 hit% 13 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=otter-8 27228918 43.69 ns/op 22.89 Mops/s 87.56 hit% 14 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru 18046910 60.22 ns/op 16.61 Mops/s 83.96 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-2 9148698 124.8 ns/op 8.012 Mops/s 83.97 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-4 5732634 208.0 ns/op 4.809 Mops/s 83.98 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru-8 4266702 297.2 ns/op 3.364 Mops/s 83.98 hit% 15 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q 13038877 117.9 ns/op 8.482 Mops/s 85.27 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-2 7812847 175.5 ns/op 5.698 Mops/s 85.24 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-4 5601277 209.2 ns/op 4.781 Mops/s 85.32 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=16K/cache=golang-lru/2q-8 3982351 303.1 ns/op 3.300 Mops/s 85.29 hit% 23 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru 8254524 148.1 ns/op 6.752 Mops/s 88.45 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-2 14618695 89.88 ns/op 11.13 Mops/s 88.43 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-4 18475584 57.42 ns/op 17.42 Mops/s 88.44 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/lru-8 34451738 34.68 ns/op 28.83 Mops/s 88.43 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq 8951392 132.3 ns/op 7.558 Mops/s 88.88 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-2 12510354 110.5 ns/op 9.053 Mops/s 89.05 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-4 15914090 71.54 ns/op 13.98 Mops/s 89.15 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/twoq-8 34480570 36.94 ns/op 27.07 Mops/s 89.38 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve 8304397 153.9 ns/op 6.498 Mops/s 89.70 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-2 16466778 74.99 ns/op 13.34 Mops/s 89.83 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-4 25451971 45.01 ns/op 22.22 Mops/s 89.95 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/sieve-8 46148224 23.70 ns/op 42.20 Mops/s 90.11 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo 8222028 146.3 ns/op 6.835 Mops/s 89.86 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-2 12526378 84.13 ns/op 11.89 Mops/s 89.93 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-4 23776284 47.92 ns/op 20.87 Mops/s 90.04 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/s3fifo-8 43878158 27.59 ns/op 36.25 Mops/s 90.19 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu 8447496 146.5 ns/op 6.825 Mops/s 89.89 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-2 14380549 78.93 ns/op 12.67 Mops/s 90.01 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-4 20946642 52.08 ns/op 19.20 Mops/s 90.12 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=evict/tinylfu-8 42690700 26.50 ns/op 37.74 Mops/s 90.40 hit% 0 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter 4611973 240.2 ns/op 4.164 Mops/s 89.58 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-2 9511718 117.9 ns/op 8.481 Mops/s 89.57 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-4 15915506 70.52 ns/op 14.18 Mops/s 89.75 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=otter-8 20581557 57.22 ns/op 17.48 Mops/s 89.84 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru 7234834 164.2 ns/op 6.090 Mops/s 88.44 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-2 4022706 321.1 ns/op 3.115 Mops/s 88.45 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-4 3551046 331.0 ns/op 3.021 Mops/s 88.46 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru-8 3134085 371.5 ns/op 2.692 Mops/s 88.44 hit% 11 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q 5143711 232.3 ns/op 4.304 Mops/s 89.41 hit% 18 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-2 3013297 370.5 ns/op 2.699 Mops/s 89.41 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-4 3010743 400.1 ns/op 2.499 Mops/s 89.43 hit% 17 B/op 0 allocs/op +BenchmarkReadThrough/capacity=1M/cache=golang-lru/2q-8 2692359 435.5 ns/op 2.296 Mops/s 89.42 hit% 17 B/op 0 allocs/op PASS -ok github.com/floatdrop/evict/bench 444.595s +ok github.com/floatdrop/evict/bench 462.789s diff --git a/bench/results/tuning.md b/bench/results/tuning.md index bff4f46..cebeecd 100644 --- a/bench/results/tuning.md +++ b/bench/results/tuning.md @@ -12,7 +12,7 @@ The caches are in one piece. A setting is written as the options that make it: `small` is WithSmallRatio, `ghosts` WithGhostRatio, `promotion` WithPromotionReads and `returns` WithGhostReturns. Where settings do equally well, the standard one is named before the others, and one with fewer ghosts before one with more: a ghost takes about -sixteen bytes. +twenty bytes. Produced by `go run ./cmd/tune -out results` with go1.27.3. diff --git a/internal/cachetest/cachetest.go b/internal/cachetest/cachetest.go index 7ef3ebb..8f8c891 100644 --- a/internal/cachetest/cachetest.go +++ b/internal/cachetest/cachetest.go @@ -17,6 +17,7 @@ import ( "weak" "github.com/floatdrop/evict" + "github.com/floatdrop/evict/internal/shards" ) // Factory creates a cache with the given capacity and number of shards, where @@ -810,23 +811,21 @@ func NoAllocs(t *testing.T, f Factories) { }) } -// Padded checks that a value of the type of shard, which a cache has many of -// in an array, ends in padding of at least the size of a cache line. Without -// it, the fields that one shard writes to would share a cache line with those -// that the readers of the next one need, and each CPU would keep taking the -// line away from the others. -func Padded(t *testing.T, shard any) { +// Padded checks that the shards of a cache, which lie side by side in an +// array, end in at least a cache line of padding and take up whole lines. +func Padded[S any](t *testing.T, _ []S) { t.Helper() - const cacheLine = 128 - - typ := reflect.TypeOf(shard) + typ := reflect.TypeFor[S]() if typ.Kind() != reflect.Struct || typ.NumField() == 0 { t.Fatalf("%v is not a struct with fields", typ) } last := typ.Field(typ.NumField() - 1) - if last.Name != "_" || last.Type.Size() < cacheLine { + if last.Name != "_" || last.Type.Size() < shards.Line { t.Errorf("%v ends with the field %q of %d bytes; want padding of %d bytes or more", - typ, last.Name, last.Type.Size(), cacheLine) + typ, last.Name, last.Type.Size(), shards.Line) + } + if typ.Size()%shards.Line != 0 { + t.Errorf("%v takes %d bytes; want a multiple of %d", typ, typ.Size(), shards.Line) } } diff --git a/internal/cslab/cslab.go b/internal/cslab/cslab.go index c688db6..40a9642 100644 --- a/internal/cslab/cslab.go +++ b/internal/cslab/cslab.go @@ -30,19 +30,25 @@ // // Changing a slab is not concurrent: writers serialize among themselves. The // methods say which side they are for. +// +// The words that readers touch are plain integers that everyone accesses with +// the functions of sync/atomic, not with the methods of its types. The code of +// a cache is generic, so it is compiled in the package that instantiates it. +// Where that package gets to the cache through a generic type of another +// package that instantiates nothing, the compiler does not inline those +// methods, only the functions, which it builds in. The 64-bit words are in +// slices, which keeps them aligned on 32-bit platforms. package cslab import ( "math" - "math/bits" "runtime" "sync/atomic" + "unsafe" ) -// MaxCapacity is the largest capacity [Slab.Init] accepts. It keeps the index -// addressable with 32 bits: that has between one and a half times and three -// times as many slots as the slab has entries, and twice as many at this -// capacity. +// MaxCapacity is the largest capacity [Slab.Init] accepts. It keeps the index, +// which has three slots for every entry, addressable with 32 bits. const MaxCapacity = 1 << 30 // minSpare is the least number of nodes that a slab has beyond its capacity. @@ -50,9 +56,8 @@ const minSpare = 16 // Node is what a reader gets to see of an entry of a [Slab]. type Node[K comparable, V any] struct { - // Meta belongs to the owner of the slab. Insert resets it to zero and - // Replace carries it over. Readers may load and store it. - Meta atomic.Uint32 + // meta belongs to the owner of the slab; see Meta. + meta uint32 //nolint:modernize // See the package documentation. // Key and Value can be read by anyone who found the node through the // index, and are never written while that is possible. @@ -60,6 +65,14 @@ type Node[K comparable, V any] struct { Value V } +// Meta returns the word of the node that belongs to the owner of the slab. +// Insert resets it to zero and Replace carries it over. Readers may load and +// store it. +func (n *Node[K, V]) Meta() uint32 { return atomic.LoadUint32(&n.meta) } + +// SetMeta sets the word that Meta returns. +func (n *Node[K, V]) SetMeta(meta uint32) { atomic.StoreUint32(&n.meta, meta) } + // Link is the part of an entry that is of use to writers only. It is kept // apart from the node, in memory that readers never look at: a writer that // moves an entry within a list changes the links of its neighbors, and that @@ -109,18 +122,13 @@ type Slab[K comparable, V any] struct { // while others wait to be reused. Nodes []Node[K, V] - // Links holds a link for every node, under the same index. - Links []Link - - // slots is the hash index: a linear-probing table whose size is a power - // of two. A slot holds the hash of an entry in its high half and the - // index of the entry's node in its low half. Zero is an empty slot: no - // entry lives in node 0. - slots []atomic.Uint64 - mask uint32 - - capacity uint32 - heads uint32 // number of list heads + // slots is the hash index: a linear-probing table of size slots. A slot + // holds the hash of an entry in its high half and the index of the + // entry's node in its low half. Zero is an empty slot: no entry lives in + // node 0. An entry's probe starts at the slot that its hash scaled to + // size points at, which spreads the hashes over a table of any size. + slots []uint64 + size uint32 // readers is where a reader pins the node it looks at, and name is what // the nodes of this slab are called there, less their index. @@ -130,20 +138,27 @@ type Slab[K comparable, V any] struct { // seq is odd while entries are being taken out of the index, which // moves other entries to different slots. A reader that did not find // its key compares seq before and after to know whether the key might - // have been moved past it. - seq atomic.Uint64 + // have been moved past it. It may wrap around: a reader would have to + // sleep through 2³¹ removals to be fooled, and would then miss a key. + seq uint32 //nolint:modernize // See the package documentation. - // overdue is set while more nodes are waiting than the slab has + // overdue is one while more nodes are waiting than the slab has // patience for, which happens when readers were looking at them the // last time the slab came for them. See Overdue. - overdue atomic.Bool + overdue uint32 // The fields above are what a reader needs, and they change only when - // an entry is removed. The ones below change with every write, and - // that should not cost the readers the cache line they keep coming - // back to. + // an entry is removed. The ones below are for writers, and most change + // with every write, which should not cost the readers the cache line + // they keep coming back to. _ [cacheLine]byte + // Links holds a link for every node, under the same index. + Links []Link + + capacity uint32 + heads uint32 // number of list heads + // count is the number of entries. Only writers change it. count atomic.Int32 @@ -184,15 +199,15 @@ func (s *Slab[K, V]) Init(capacity, heads int, r *Readers) { spare = max(patience, minSpare) } - // The smallest power of two above 1.5 times the number of nodes that - // can be indexed keeps the load factor at or below 2/3 and guarantees - // an empty slot, which is what ends an unsuccessful probe. - size := uint(1) << bits.Len(uint(capacity+capacity/2)) + // Three slots for every entry that can be indexed keep the load factor + // at or below a third, whatever the capacity, and guarantee an empty + // slot, which is what ends an unsuccessful probe. + size := max(3*uint(capacity), 1) s.Nodes = make([]Node[K, V], heads+capacity+spare) s.Links = make([]Link, len(s.Nodes)) - s.slots = make([]atomic.Uint64, size) - s.mask = uint32(size - 1) + s.slots = make([]uint64, size) + s.size = uint32(size) s.readers = r s.name = r.name() s.capacity = uint32(capacity) @@ -232,34 +247,37 @@ func (s *Slab[K, V]) Hash(idx uint32) uint32 { return s.Links[idx].hash } // meantime, or if no slot was to be had for pinning a node. The caller should // then ask again as a writer, with [Slab.Find]. func (s *Slab[K, V]) Lookup(hash uint32, key K, limit uint32, tally bool) (value V, found, certain bool) { - seq := s.seq.Load() + seq := atomic.LoadUint32(&s.seq) - slots, mask := s.slots, s.mask - i := hash & mask + slots, size := s.slots, s.size + i := uint32(uint64(hash) * uint64(size) >> 32) // The index always has an empty slot, but with entries moving around a // reader is not certain to see one. Give up after one round. for range slots { - word := slots[i].Load() + word := atomic.LoadUint64(&slots[i]) if word == 0 { - return value, false, seq&1 == 0 && s.seq.Load() == seq + return value, false, seq&1 == 0 && atomic.LoadUint32(&s.seq) == seq } if word>>32 != uint64(hash) { - i = (i + 1) & mask + i++ + if i == size { + i = 0 + } continue } node := s.name | word&math.MaxUint32 - slot := s.readers.Pin(node) + slot := s.pin(node) if slot == nil { - if slot = s.readers.PinAny(node); slot == nil { + if slot = s.pinAny(node); slot == nil { return value, false, false } } // The pin counts only if the node was still in the index when it // was in place. If the slot of the index has changed, look at it // again; this does not go on forever, see above. - if slots[i].Load() != word { - slot.Unpin() + if atomic.LoadUint64(&slots[i]) != word { + atomic.StoreUint64(&slot.pin, 0) continue } @@ -271,19 +289,19 @@ func (s *Slab[K, V]) Lookup(hash uint32, key K, limit uint32, tally bool) (value // one that was found, and so it is counted before the key is known // to be the right one. n := &s.Nodes[uint32(word)] - f := n.Meta.Load() + f := n.Meta() if f < limit { - n.Meta.Store(f + 1) + n.SetMeta(f + 1) } k := n.Key value = n.Value - slot.Unpin() + atomic.StoreUint64(&slot.pin, 0) if k == key { // The slot is no longer this reader's, but the count is // atomic, and its line is still in this CPU's cache. if tally { - slot.hits.Add(1) + atomic.AddUint64(&slot.hits, 1) } return value, true, true } @@ -301,11 +319,14 @@ func (s *Slab[K, V]) Lookup(hash uint32, key K, limit uint32, tally bool) (value // take a shared hash and a race on top, and cost one entry one // read. if f < limit { - n.Meta.CompareAndSwap(f+1, f) + atomic.CompareAndSwapUint32(&n.meta, f+1, f) } var zero V value = zero - i = (i + 1) & mask + i++ + if i == size { + i = 0 + } } return value, false, false } @@ -316,18 +337,65 @@ func (s *Slab[K, V]) Lookup(hash uint32, key K, limit uint32, tally bool) (value // a reader is held up. func (s *Slab[K, V]) Pin(idx uint32) *Slot { node := s.name | uint64(idx) - if slot := s.readers.Pin(node); slot != nil { + if slot := s.pin(node); slot != nil { return slot } - return s.readers.PinAny(node) + return s.pinAny(node) +} + +// pin announces that the caller is about to look at a node, and returns the +// slot of the readers that says so. The node is safe to look at only if it is +// in the index after pin has returned: a slab that took the node out earlier +// may not have seen the pin. The caller clears the slot when it is done with +// the node, by storing zero in its pin. +// +// pin returns nil if the slot that the caller prefers is taken, which is +// rare. The caller should then try pinAny. +func (s *Slab[K, V]) pin(node uint64) *Slot { + slot := &s.readers.slots[s.preferred()] + if atomic.CompareAndSwapUint64(&slot.pin, 0, node) { + return slot + } + return nil +} + +// preferred returns the slot that the calling goroutine goes for first. +// +// A goroutine picks the same slot every time, which keeps the slot in the +// cache of the CPU it runs on. There is no way to ask which goroutine or CPU +// this is, but the whereabouts of the stack tell one goroutine from another: +// stacks are at least 2 KiB in size. The bits of the address below that say +// how deep into its stack a goroutine is, and are dropped. +func (s *Slab[K, V]) preferred() uint64 { + var onStack byte + //nolint:gosec // The address is only hashed, never turned back into a pointer. + stack := uint64(uintptr(unsafe.Pointer(&onStack))) >> 11 + return (stack * 0x9e3779b97f4a7c15) >> s.readers.shift +} + +// pinAny is pin for a caller whose preferred slot is taken: it tries the +// slots after that one. It returns nil if those are taken as well, and the +// caller then has to do its reading under the lock of the slab instead. +// +// It is a function of its own so that pin is small enough to be inlined. +func (s *Slab[K, V]) pinAny(node uint64) *Slot { + slots := s.readers.slots + i, mask := s.preferred(), uint64(len(slots)-1) + for range 3 { + i = (i + 1) & mask + if slot := &slots[i]; atomic.CompareAndSwapUint64(&slot.pin, 0, node) { + return slot + } + } + return nil } // Find returns the index of the node that holds key, or 0 if there is none. // It is for writers. func (s *Slab[K, V]) Find(hash uint32, key K) uint32 { - slots, mask := s.slots, s.mask - for i := hash & mask; ; i = (i + 1) & mask { - slot := slots[i].Load() + slots, size := s.slots, s.size + for i := uint32(uint64(hash) * uint64(size) >> 32); ; { + slot := atomic.LoadUint64(&slots[i]) if slot == 0 { return 0 } @@ -336,6 +404,10 @@ func (s *Slab[K, V]) Find(hash uint32, key K) uint32 { return idx } } + i++ + if i == size { + i = 0 + } } } @@ -353,17 +425,20 @@ func (s *Slab[K, V]) Insert(hash uint32, key K, value V) uint32 { idx := s.alloc() s.Links[idx].hash, s.Links[idx].Tag = hash, 0 n := &s.Nodes[idx] - n.Meta.Store(0) + n.SetMeta(0) n.Key = key n.Value = value - slots, mask := s.slots, s.mask - i := hash & mask - for slots[i].Load() != 0 { - i = (i + 1) & mask + slots, size := s.slots, s.size + i := uint32(uint64(hash) * uint64(size) >> 32) + for atomic.LoadUint64(&slots[i]) != 0 { + i++ + if i == size { + i = 0 + } } // From here on readers can find the node. - slots[i].Store(uint64(hash)<<32 | uint64(idx)) + atomic.StoreUint64(&slots[i], uint64(hash)<<32|uint64(idx)) s.count.Add(1) return idx @@ -377,7 +452,7 @@ func (s *Slab[K, V]) Insert(hash uint32, key K, value V) uint32 { func (s *Slab[K, V]) Replace(idx uint32, key K, value V) uint32 { to := s.alloc() old, n := &s.Nodes[idx], &s.Nodes[to] - n.Meta.Store(old.Meta.Load()) + n.SetMeta(old.Meta()) n.Key = key n.Value = value @@ -388,7 +463,7 @@ func (s *Slab[K, V]) Replace(idx uint32, key K, value V) uint32 { // From here on readers find the new node. The ones that found the old // one keep reading the old value. - s.slots[s.slotOf(link.hash, idx)].Store(uint64(link.hash)<<32 | uint64(to)) + atomic.StoreUint64(&s.slots[s.slotOf(link.hash, idx)], uint64(link.hash)<<32|uint64(to)) s.retire(idx) return to @@ -402,9 +477,9 @@ func (s *Slab[K, V]) Replace(idx uint32, key K, value V) uint32 { // waiting than it has patience for, or when it is asked to; see // [Slab.Reclaim]. func (s *Slab[K, V]) Remove(idx uint32) { - s.seq.Add(1) + atomic.AddUint32(&s.seq, 1) s.unindex(s.Links[idx].hash, idx) - s.seq.Add(1) + atomic.AddUint32(&s.seq, 1) s.count.Add(-1) s.retire(idx) @@ -413,38 +488,54 @@ func (s *Slab[K, V]) Remove(idx uint32) { // slotOf returns the slot that refers to node idx. It panics if the node holds // no entry. func (s *Slab[K, V]) slotOf(hash, idx uint32) uint32 { - slots, mask := s.slots, s.mask - for i := hash & mask; ; i = (i + 1) & mask { - slot := slots[i].Load() + slots, size := s.slots, s.size + for i := uint32(uint64(hash) * uint64(size) >> 32); ; { + slot := atomic.LoadUint64(&slots[i]) if slot == 0 { panic("cslab: node is not indexed") } if slot&(1<<32-1) == uint64(idx) { return i } + i++ + if i == size { + i = 0 + } } } // unindex empties the slot that refers to node idx, then closes the gap so // that probe sequences running through it stay unbroken. func (s *Slab[K, V]) unindex(hash, idx uint32) { - slots, mask := s.slots, s.mask + slots, size := s.slots, s.size hole := s.slotOf(hash, idx) // Every entry between the hole and the next empty slot moves back into // the hole if that keeps it at or after its home slot. Distances are - // taken modulo the table size. - for i := (hole + 1) & mask; ; i = (i + 1) & mask { - slot := slots[i].Load() + // taken around the end of the table. + for i := hole; ; { + i++ + if i == size { + i = 0 + } + slot := atomic.LoadUint64(&slots[i]) if slot == 0 { break } - if home := uint32(slot>>32) & mask; (i-home)&mask >= (i-hole)&mask { - slots[hole].Store(slot) + home := uint32((slot >> 32) * uint64(size) >> 32) + fromHome, fromHole := i-home, i-hole + if i < home { + fromHome += size + } + if i < hole { + fromHole += size + } + if fromHome >= fromHole { + atomic.StoreUint64(&slots[hole], slot) hole = i } } - slots[hole].Store(0) + atomic.StoreUint64(&slots[hole], 0) } // retire queues up a node that has just left the index, and lets go of the @@ -482,7 +573,7 @@ func (s *Slab[K, V]) enqueue(idx uint32) { // tried to let go. Anyone may call it. Whoever finds it true can help by // calling [Slab.Reclaim] as a writer: the slab itself tries again only when // it is written to, which may not be any time soon. -func (s *Slab[K, V]) Overdue() bool { return s.overdue.Load() } +func (s *Slab[K, V]) Overdue() bool { return atomic.LoadUint32(&s.overdue) != 0 } // Reclaim releases the keys and the values of the entries that have left and // that no reader is looking at. It is for writers. @@ -566,7 +657,11 @@ func (s *Slab[K, V]) reclaim(what int) bool { // is written only when it changes. if late != s.late { s.late = late - s.overdue.Store(late) + var overdue uint32 + if late { + overdue = 1 + } + atomic.StoreUint32(&s.overdue, overdue) } return released } @@ -586,7 +681,7 @@ func (s *Slab[K, V]) look() bool { found int ) for i := range r.slots { - pin := r.slots[i].pin.Load() + pin := atomic.LoadUint64(&r.slots[i].pin) if pin == 0 { continue } @@ -708,9 +803,16 @@ func (s *Slab[K, V]) release(looked uint64) bool { func (s *Slab[K, V]) MaxDisplacement() int { longest := uint32(0) for i := range s.slots { - if slot := s.slots[i].Load(); slot != 0 { - longest = max(longest, (uint32(i)-uint32(slot>>32))&s.mask) + slot := atomic.LoadUint64(&s.slots[i]) + if slot == 0 { + continue + } + at, home := uint32(i), uint32((slot>>32)*uint64(s.size)>>32) + distance := at - home + if at < home { + distance += s.size } + longest = max(longest, distance) } return int(longest) } @@ -721,11 +823,11 @@ func (s *Slab[K, V]) MaxDisplacement() int { // [Slab.Released] with the mark that Reset returns, before any other writer // gets a turn. func (s *Slab[K, V]) Reset() (mark uint64) { - s.seq.Add(1) + atomic.AddUint32(&s.seq, 1) for i := range s.slots { - s.slots[i].Store(0) + atomic.StoreUint64(&s.slots[i], 0) } - s.seq.Add(1) + atomic.AddUint32(&s.seq, 1) s.count.Store(0) for head := range s.heads { diff --git a/internal/cslab/cslab_test.go b/internal/cslab/cslab_test.go index 5c81f58..2cd128d 100644 --- a/internal/cslab/cslab_test.go +++ b/internal/cslab/cslab_test.go @@ -20,13 +20,13 @@ func check[K, V comparable](t *testing.T, s *Slab[K, V], want map[K]V) { if s.Len() != len(want) { t.Fatalf("Len() = %d, want %d", s.Len(), len(want)) } - if s.seq.Load()&1 != 0 { - t.Fatalf("seq = %d is odd while nothing is being removed", s.seq.Load()) + if atomic.LoadUint32(&s.seq)&1 != 0 { + t.Fatalf("seq = %d is odd while nothing is being removed", atomic.LoadUint32(&s.seq)) } indexed := make(map[uint32]bool, len(want)) for i := range s.slots { - slot := s.slots[i].Load() + slot := atomic.LoadUint64(&s.slots[i]) if slot == 0 { continue } @@ -135,6 +135,17 @@ func mustPanic(t *testing.T, what string, f func()) { f() } +// homeAt returns the lowest hash whose home is the given slot of an index +// with size slots, for tests that want entries in particular places. +func homeAt(size, slot uint32) uint32 { + return uint32((uint64(slot)<<32 + uint64(size) - 1) / uint64(size)) +} + +// hashOf is a hash for keys in a row that gives them homes all over the +// index. The index goes by the upper bits of a hash, which keys in a row +// share. +func hashOf(key int) uint32 { return uint32(key) * 0x9e3779b9 } + func TestInit(t *testing.T) { t.Parallel() @@ -143,10 +154,10 @@ func TestInit(t *testing.T) { wantNodes, wantSlots int }{ {0, 1, 1, 1}, // No entries, so no spare nodes either. - {1, 1, 1 + 1 + 16, 2}, // At least sixteen spare nodes. - {100, 2, 2 + 100 + 16, 256}, - {400, 1, 1 + 400 + 50, 1024}, - {10_000, 1, 1 + 10_000 + 1024, 16384}, // At most 1024. + {1, 1, 1 + 1 + 16, 3}, // At least sixteen spare nodes. + {100, 2, 2 + 100 + 16, 300}, + {400, 1, 1 + 400 + 50, 1200}, + {10_000, 1, 1 + 10_000 + 1024, 30_000}, // At most 1024. } for _, tt := range tests { var s Slab[int, int] @@ -210,7 +221,7 @@ func TestInsertReplaceRemove(t *testing.T) { if pinA == nil || pinB == nil || pinA == pinB { t.Fatalf("Pin took the slots %p and %p", pinA, pinB) } - s.Nodes[b].Meta.Store(7) + s.Nodes[b].SetMeta(7) s.Links[b].Tag = 9 b2 := s.Replace(b, "b", 21) want["b"] = 21 @@ -221,8 +232,8 @@ func TestInsertReplaceRemove(t *testing.T) { if got := s.Find(1, "b"); got != b2 { t.Errorf(`Find("b") = %d after Replace, want %d`, got, b2) } - if n := &s.Nodes[b2]; n.Value != 21 || n.Meta.Load() != 7 || s.Links[b2].Tag != 9 { - t.Errorf("new node holds %d with Meta %d and Tag %d, want 21 with 7 and 9", n.Value, n.Meta.Load(), s.Links[b2].Tag) + if n := &s.Nodes[b2]; n.Value != 21 || n.Meta() != 7 || s.Links[b2].Tag != 9 { + t.Errorf("new node holds %d with Meta %d and Tag %d, want 21 with 7 and 9", n.Value, n.Meta(), s.Links[b2].Tag) } if got := list(t, &s, 0); !slices.Equal(got, []string{"c", "b", "a"}) { t.Errorf("list = %v after Replace, want [c b a]", got) @@ -289,8 +300,8 @@ func TestInsertReplaceRemove(t *testing.T) { t.Fatalf("Insert used the nodes %v, not the node %d that was released", reused, b) } for _, idx := range reused { - if s.Nodes[idx].Meta.Load() != 0 || s.Links[idx].Tag != 0 { - t.Errorf("reused node %d has Meta %d and Tag %d, want 0 and 0", idx, s.Nodes[idx].Meta.Load(), s.Links[idx].Tag) + if s.Nodes[idx].Meta() != 0 || s.Links[idx].Tag != 0 { + t.Errorf("reused node %d has Meta %d and Tag %d, want 0 and 0", idx, s.Nodes[idx].Meta(), s.Links[idx].Tag) } s.Remove(idx) } @@ -338,15 +349,18 @@ func TestChurn(t *testing.T) { for _, capacity := range []int{1, 2, 7, 40, 300} { rng := rand.New(rand.NewPCG(uint64(capacity), 3)) - hashOf := func(key int) uint32 { return uint32(key%7) * 0x2000_0001 } var s Slab[int, int] s.Init(capacity, 1, NewReaders()) want := map[int]int{} + // Seven hashes, homed in slots in a row that run across the end. + size := uint32(len(s.slots)) + colliding := func(key int) uint32 { return homeAt(size, (size-3+uint32(key%7))%size) } + for step := range 30_000 { key := rng.IntN(2*capacity + 1) - hash := hashOf(key) + hash := colliding(key) idx := s.Find(hash, key) if _, present := want[key]; (idx != 0) != present { @@ -387,7 +401,7 @@ func pin[K comparable, V any](t *testing.T, s *Slab[K, V], idx uint32) *Slot { t.Helper() for i := range s.readers.slots { - if slot := &s.readers.slots[i]; slot.pin.CompareAndSwap(0, s.name|uint64(idx)) { + if slot := &s.readers.slots[i]; atomic.CompareAndSwapUint64(&slot.pin, 0, s.name|uint64(idx)) { return slot } } @@ -409,12 +423,12 @@ func TestPinnedNodeIsLeftAlone(t *testing.T) { other.Init(capacity, 1, readers) for key := range capacity { - s.PushFront(0, s.Insert(uint32(key), key, "old")) - other.PushFront(0, other.Insert(uint32(key), key, "other")) + s.PushFront(0, s.Insert(hashOf(key), key, "old")) + other.PushFront(0, other.Insert(hashOf(key), key, "other")) } // A reader finds an entry and takes its time. - idx := s.Find(0, 0) + idx := s.Find(hashOf(0), 0) slot := s.Pin(idx) if idx == 0 || slot == nil { t.Fatalf("key 0 is in node %d, pinned in slot %p", idx, slot) @@ -426,7 +440,7 @@ func TestPinnedNodeIsLeftAlone(t *testing.T) { want := map[int]string{} for round := range 100 { for key := range capacity { - s.Replace(s.Find(uint32(key), key), key, "new") + s.Replace(s.Find(hashOf(key), key), key, "new") want[key] = "new" } if n.Key != 0 || n.Value != "old" { @@ -439,7 +453,7 @@ func TestPinnedNodeIsLeftAlone(t *testing.T) { check(t, &s, want) // The node of another slab with the same index is none of its business. - otherIdx := other.Find(0, 0) + otherIdx := other.Find(hashOf(0), 0) if otherIdx != idx { t.Fatalf("key 0 is in node %d of one slab and in node %d of the other; the test needs them to agree", idx, otherIdx) } @@ -476,13 +490,13 @@ func TestWriterWaitsForSpareNode(t *testing.T) { spare := len(s.Nodes) - capacity - 1 for key := range capacity { - s.PushFront(0, s.Insert(uint32(key), key, "old")) + s.PushFront(0, s.Insert(hashOf(key), key, "old")) } // Every replacement leaves a node behind that a reader is looking at. pins, nodes := make([]*Slot, 0, spare), make([]uint32, 0, spare) for i := range spare { - idx := s.Find(uint32(i%capacity), i%capacity) + idx := s.Find(hashOf(i%capacity), i%capacity) pins, nodes = append(pins, pin(t, &s, idx)), append(nodes, idx) s.Replace(idx, i%capacity, "pinned") } @@ -494,7 +508,7 @@ func TestWriterWaitsForSpareNode(t *testing.T) { done := make(chan struct{}) go func() { defer close(done) - s.Replace(s.Find(1, 1), 1, "new") // Needs a node, and has to wait for one. + s.Replace(s.Find(hashOf(1), 1), 1, "new") // Needs a node, and has to wait for one. }() // The writer looks for a node again and again. By its second look it // has come away with nothing at least once; until then it may not even @@ -527,7 +541,7 @@ func TestWriterWaitsForSpareNode(t *testing.T) { case <-time.After(10 * time.Second): t.Fatal("Replace is still waiting although a reader has left") } - if got := s.Nodes[s.Find(1, 1)].Value; got != "new" { + if got := s.Nodes[s.Find(hashOf(1), 1)].Value; got != "new" { t.Errorf("key 1 has the value %q after Replace", got) } @@ -564,7 +578,7 @@ func TestOverdue(t *testing.T) { var s Slab[int, *int] s.Init(capacity, 1, NewReaders()) for key := range capacity { - s.PushFront(0, s.Insert(uint32(key), key, new(key))) + s.PushFront(0, s.Insert(hashOf(key), key, new(key))) } if s.Overdue() { t.Fatal("a slab that nothing has left is overdue") @@ -574,11 +588,11 @@ func TestOverdue(t *testing.T) { // with the others. pins := make([]*Slot, 0, pinned) for key := range pinned { - pins = append(pins, pin(t, &s, s.Find(uint32(key), key))) + pins = append(pins, pin(t, &s, s.Find(hashOf(key), key))) } most, idle := 0, 0 for key := range capacity { - idx := s.Find(uint32(key), key) + idx := s.Find(hashOf(key), key) s.Unlink(idx) before := int(s.waiting) s.Remove(idx) @@ -623,10 +637,10 @@ func TestOverdue(t *testing.T) { // It is back to normal: a few nodes may wait, more may not. for key := range capacity { - s.PushFront(0, s.Insert(uint32(key), key, new(key))) + s.PushFront(0, s.Insert(hashOf(key), key, new(key))) } for key := range capacity { - idx := s.Find(uint32(key), key) + idx := s.Find(hashOf(key), key) s.Unlink(idx) s.Remove(idx) if s.Overdue() || s.waiting > 8 { @@ -678,7 +692,7 @@ func TestLookupWithoutSlot(t *testing.T) { } // No lookup leaves a node pinned. for i := range readers.slots { - if pin := readers.slots[i].pin.Load(); pin != 0 { + if pin := atomic.LoadUint64(&readers.slots[i].pin); pin != 0 { t.Errorf("slot %d is left with the pin %#x", i, pin) } } @@ -745,29 +759,29 @@ func TestLookupCounts(t *testing.T) { s.Init(8, 1, NewReaders()) idx := s.Insert(1, 10, 100) s.PushFront(0, idx) - meta := &s.Nodes[idx].Meta + node := &s.Nodes[idx] for range 3 { s.Lookup(1, 10, 0, false) } - if got := meta.Load(); got != 0 { + if got := node.Meta(); got != 0 { t.Errorf("Meta = %d after lookups with a limit of 0, want it untouched", got) } for i := range 5 { s.Lookup(1, 10, 3, false) - if got, want := meta.Load(), uint32(min(i+1, 3)); got != want { + if got, want := node.Meta(), uint32(min(i+1, 3)); got != want { t.Errorf("Meta = %d after %d lookups with a limit of 3, want %d", got, i+1, want) } } // A limit below what has been counted leaves it alone as well. s.Lookup(1, 10, 1, false) - if got := meta.Load(); got != 3 { + if got := node.Meta(); got != 3 { t.Errorf("Meta = %d after a lookup with a limit of 1, want 3", got) } // A miss counts nothing. s.Lookup(1, 11, 3, false) s.Lookup(2, 10, 3, false) - if got := meta.Load(); got != 3 { + if got := node.Meta(); got != 3 { t.Errorf("Meta = %d after misses, want 3", got) } @@ -781,7 +795,7 @@ func TestLookupCounts(t *testing.T) { same.PushFront(0, first) same.PushFront(0, second) counts := func() [2]uint32 { - return [2]uint32{same.Nodes[first].Meta.Load(), same.Nodes[second].Meta.Load()} + return [2]uint32{same.Nodes[first].Meta(), same.Nodes[second].Meta()} } if v, ok, _ := same.Lookup(7, 2, 3, false); !ok || v != 20 { @@ -876,10 +890,10 @@ func TestReleasedMark(t *testing.T) { var s Slab[int, int] s.Init(64, 1, readers) for key := range 4 { - s.PushFront(0, s.Insert(uint32(key), key, key)) + s.PushFront(0, s.Insert(hashOf(key), key, key)) } leave := func(key int) (idx uint32, slot *Slot) { - idx = s.Find(uint32(key), key) + idx = s.Find(hashOf(key), key) slot = pin(t, &s, idx) s.Unlink(idx) s.Remove(idx) @@ -912,12 +926,12 @@ func TestReleasedMark(t *testing.T) { } // Reset returns the mark that covers everything it has removed. - rest := pin(t, &s, s.Find(2, 2)) + rest := pin(t, &s, s.Find(hashOf(2), 2)) mark = s.Reset() if s.Released(mark) { t.Error("Released reports that nothing is held on to after Reset, while a reader looks at an entry") } - s.PushFront(0, s.Insert(9, 9, 9)) + s.PushFront(0, s.Insert(hashOf(9), 9, 9)) later, laterPin := leave(9) rest.Unpin() if !s.Released(mark) || s.Nodes[later].Value != 9 { @@ -941,14 +955,14 @@ func fullWithOnePinned(t *testing.T) (readers *Readers, a, b *Slab[int, int], pi a.Init(capacity, 1, readers) b.Init(capacity, 1, readers) for key := range capacity { - a.PushFront(0, a.Insert(uint32(key), key, 1000+key)) - b.PushFront(0, b.Insert(uint32(key), key, 1000+key)) + a.PushFront(0, a.Insert(hashOf(key), key, 1000+key)) + b.PushFront(0, b.Insert(hashOf(key), key, 1000+key)) } - pinned = b.Find(0, 0) + pinned = b.Find(hashOf(0), 0) held = pin(t, b, pinned) for key := range 32 { - b.Replace(b.Find(uint32(key), key), key, 2000+key) + b.Replace(b.Find(hashOf(key), key), key, 2000+key) } if b.waiting != 32 || b.free != 0 || int(b.fresh) != len(b.Nodes) { t.Fatalf("b has %d nodes waiting, free list at %d, fresh at %d of %d", b.waiting, b.free, b.fresh, len(b.Nodes)) @@ -975,7 +989,7 @@ func TestAllocBorrowsAroundPin(t *testing.T) { } // a looks, and sees the reader of b's node. - idx := a.Find(7, 7) + idx := a.Find(hashOf(7), 7) a.Unlink(idx) a.Remove(idx) a.Reclaim() @@ -985,7 +999,7 @@ func TestAllocBorrowsAroundPin(t *testing.T) { } // b needs a node: it goes by the look of a, and leaves the pinned one. - b.Replace(b.Find(40, 40), 40, 2040) + b.Replace(b.Find(hashOf(40), 40), 40, 2040) intact("after a borrowed look") if got := readers.time.Load(); got != looked { t.Errorf("b looked for itself (time %d -> %d)", looked, got) @@ -996,7 +1010,7 @@ func TestAllocBorrowsAroundPin(t *testing.T) { // The same look is of no further use: b looks, and still leaves the node. for key := 41; key < 41+31; key++ { - b.Replace(b.Find(uint32(key), key), key, 2000+key) + b.Replace(b.Find(hashOf(key), key), key, 2000+key) intact("in the second round") } if got := readers.time.Load(); got != looked+1 { @@ -1010,7 +1024,7 @@ func TestAllocBorrowsAroundPin(t *testing.T) { // which gets b nothing, so it looks again and the node is released. held.Unpin() for key := 80; key < 80+31; key++ { - b.Replace(b.Find(uint32(key), key), key, 2000+key) + b.Replace(b.Find(hashOf(key), key), key, 2000+key) } if got := readers.time.Load(); got != looked+2 { t.Errorf("time is %d, want two looks by b on top of %d", got, looked) @@ -1034,7 +1048,7 @@ func TestAllocAndTooManyPins(t *testing.T) { // a looks while more slots are taken than a look writes down. release := readers.Occupy(0) defer release() - idx := a.Find(7, 7) + idx := a.Find(hashOf(7), 7) a.Unlink(idx) a.Remove(idx) a.Reclaim() @@ -1043,7 +1057,7 @@ func TestAllocAndTooManyPins(t *testing.T) { t.Fatalf("the look wrote down %d pins, want -1 for too many", got) } - b.Replace(b.Find(40, 40), 40, 2040) + b.Replace(b.Find(hashOf(40), 40), 40, 2040) if n := &b.Nodes[pinned]; n.Key != 0 || n.Value != 1000 { t.Fatalf("the node that a reader looks at holds %d=%d", n.Key, n.Value) } @@ -1091,7 +1105,7 @@ func TestSharedLooks(t *testing.T) { delete(has, s.Nodes[idx].Key) s.Unlink(idx) s.Remove(idx) - s.PushFront(0, s.Insert(uint32(fresh), fresh, 0)) + s.PushFront(0, s.Insert(hashOf(fresh), fresh, 0)) has[fresh] = 0 }, } @@ -1103,7 +1117,7 @@ func TestSharedLooks(t *testing.T) { all[i].Init(capacity, 1, readers) has[i] = contents{} for key := range capacity { - all[i].PushFront(0, all[i].Insert(uint32(key), key, 0)) + all[i].PushFront(0, all[i].Insert(hashOf(key), key, 0)) has[i][key] = 0 } } @@ -1144,11 +1158,11 @@ func TestBorrowedLook(t *testing.T) { a.Init(capacity, 1, readers) b.Init(capacity, 1, readers) for key := range capacity { - a.PushFront(0, a.Insert(uint32(key), key, key)) - b.PushFront(0, b.Insert(uint32(key), key, key)) + a.PushFront(0, a.Insert(hashOf(key), key, key)) + b.PushFront(0, b.Insert(hashOf(key), key, key)) } remove := func(s *Slab[int, int], key int) { - idx := s.Find(uint32(key), key) + idx := s.Find(hashOf(key), key) s.Unlink(idx) s.Remove(idx) } @@ -1157,11 +1171,11 @@ func TestBorrowedLook(t *testing.T) { // not yet more than b has patience for. Another reader is looking at // an entry of a, in the node of the same number as one of those that // leave b; that is no concern of b's. - held := pin(t, &b, b.Find(3, 3)) - if a.Find(5, 5) != b.Find(5, 5) { - t.Fatalf("key 5 is in node %d of a and in node %d of b; the test needs them to agree", a.Find(5, 5), b.Find(5, 5)) + held := pin(t, &b, b.Find(hashOf(3), 3)) + if a.Find(hashOf(5), 5) != b.Find(hashOf(5), 5) { + t.Fatalf("key 5 is in node %d of a and in node %d of b; the test needs them to agree", a.Find(hashOf(5), 5), b.Find(hashOf(5), 5)) } - elsewhere := pin(t, &a, a.Find(5, 5)) + elsewhere := pin(t, &a, a.Find(hashOf(5), 5)) defer elsewhere.Unpin() for key := range 8 { remove(&b, key) @@ -1251,7 +1265,7 @@ func TestEverySlotCounts(t *testing.T) { s.PushFront(0, idx) for i := range readers.slots { - readers.slots[i].pin.Store(s.name | uint64(idx)) + atomic.StoreUint64(&readers.slots[i].pin, s.name|uint64(idx)) idx = s.Replace(idx, 1, i) old := s.limboTail for range 3 { @@ -1260,7 +1274,7 @@ func TestEverySlotCounts(t *testing.T) { if s.waiting != 1 || s.Nodes[old].Key != 1 { t.Fatalf("a node that is pinned in slot %d was released", i) } - readers.slots[i].pin.Store(0) + atomic.StoreUint64(&readers.slots[i].pin, 0) s.Reclaim() if s.waiting != 0 { t.Fatalf("a node is held on to after slot %d was cleared", i) @@ -1281,12 +1295,12 @@ func TestPatience(t *testing.T) { limit := min(max(capacity/8, 1), 1024) for key := range capacity { - s.PushFront(0, s.Insert(uint32(key), key, key)) + s.PushFront(0, s.Insert(hashOf(key), key, key)) } most := 0 for round := range 4 { for key := range capacity { - s.Replace(s.Find(uint32(key), key), key, round) + s.Replace(s.Find(hashOf(key), key), key, round) if int(s.waiting) > limit { t.Fatalf("capacity %d: %d nodes are waiting, want at most %d", capacity, s.waiting, limit) } @@ -1302,6 +1316,23 @@ func TestPatience(t *testing.T) { } } +// TestSlabLayout checks that what a reader needs of a slab fits on one cache +// line, even when the slab starts a word into one, behind the header that the +// allocator puts before most arrays of shards; and that the fields of the +// writers keep a line away from it. +func TestSlabLayout(t *testing.T) { + t.Parallel() + + var s Slab[string, string] + end := unsafe.Offsetof(s.overdue) + unsafe.Sizeof(s.overdue) + if end > cacheLine-8 { + t.Errorf("what readers need ends %d bytes into the slab, want %d at most", end, cacheLine-8) + } + if gap := unsafe.Offsetof(s.Links) - end; gap < cacheLine { + t.Errorf("the fields of the writers start %d bytes after what readers need, want %d or more", gap, cacheLine) + } +} + func TestReaders(t *testing.T) { t.Parallel() @@ -1316,7 +1347,7 @@ func TestReaders(t *testing.T) { } // With the shift that goes with them, no slot is out of reach and // none is out of range. - if got := small.preferred(); got >= uint64(want) { + if got := (&Slab[int, int]{readers: small}).preferred(); got >= uint64(want) { t.Errorf("newReaders(%d): the preferred slot is %d of %d", n, got, want) } } @@ -1341,36 +1372,40 @@ func TestReaders(t *testing.T) { t.Errorf("the first two slabs are called %#x and %#x", first, second) } + // A slab pins nodes in the slots of its readers, and needs nothing else + // of its own for that. + s := &Slab[int, int]{readers: r} + // A goroutine that pins a node gets a slot, and the same one every time. - slot := r.Pin(first | 1) + slot := s.pin(first | 1) if slot == nil { - t.Fatal("Pin found no slot in an idle Readers") + t.Fatal("pin found no slot in an idle Readers") } - if got := slot.pin.Load(); got != first|1 { + if got := atomic.LoadUint64(&slot.pin); got != first|1 { t.Errorf("the slot says %#x, want %#x", got, first|1) } slot.Unpin() - if again := r.Pin(first | 2); again != slot { - t.Errorf("Pin took the slot %p, then %p", slot, again) + if again := s.pin(first | 2); again != slot { + t.Errorf("pin took the slot %p, then %p", slot, again) } // A goroutine that does not let go uses up the slots it may try, and is // then told to read under a lock instead. The other slots stay free. held := []*Slot{slot} - if r.Pin(first|3) != nil { - t.Fatal("Pin handed out a slot that is taken") + if s.pin(first|3) != nil { + t.Fatal("pin handed out a slot that is taken") } for { - slot := r.PinAny(first | 3) + slot := s.pinAny(first | 3) if slot == nil { break } if slices.Contains(held, slot) { - t.Fatal("PinAny handed out a slot that is taken") + t.Fatal("pinAny handed out a slot that is taken") } held = append(held, slot) if len(held) > len(r.slots) { - t.Fatal("PinAny keeps handing out slots") + t.Fatal("pinAny keeps handing out slots") } } if len(held) != 4 { @@ -1381,7 +1416,7 @@ func TestReaders(t *testing.T) { // gives back no more than it took. count := func() (taken int) { for i := range r.slots { - if r.slots[i].pin.Load() != 0 { + if atomic.LoadUint64(&r.slots[i].pin) != 0 { taken++ } } @@ -1398,7 +1433,7 @@ func TestReaders(t *testing.T) { } release() for i := range r.slots { - if got := r.slots[i].pin.Load() != 0; got != slices.Contains(held, &r.slots[i]) { + if got := atomic.LoadUint64(&r.slots[i].pin) != 0; got != slices.Contains(held, &r.slots[i]) { t.Errorf("slot %d is taken: %t, after the occupied ones were given back", i, got) } } @@ -1406,8 +1441,8 @@ func TestReaders(t *testing.T) { for _, slot := range held { slot.Unpin() } - if slot := r.Pin(first | 4); slot == nil { - t.Error("Pin found no slot after all of them were released") + if slot := s.pin(first | 4); slot == nil { + t.Error("pin found no slot after all of them were released") } else { slot.Unpin() } @@ -1430,7 +1465,6 @@ func TestConcurrentReaders(t *testing.T) { steps = 30_000 } - hashOf := func(key int) uint32 { return uint32(key & 1) } // A value vouches for itself, and one that is all zeros does not: that // is what a node holds that the slab has let go of. const sum = 0x5ca1ab1e @@ -1441,6 +1475,16 @@ func TestConcurrentReaders(t *testing.T) { var s Slab[int, value] s.Init(capacity, 1, readers) + // Every key has one of two hashes, homed in the last slot and in the + // first, so entries keep moving around in the index and across its end. + size := uint32(len(s.slots)) + twoHashes := func(key int) uint32 { + if key&1 == 0 { + return homeAt(size, size-1) + } + return homeAt(size, 0) + } + // present[key] is even while key is in the slab. The writer makes it odd // before it removes the key and even again after it has put it back, so // a reader that sees the same even number before and after a lookup @@ -1461,7 +1505,7 @@ func TestConcurrentReaders(t *testing.T) { key := rng.IntN(keys) before := present[key].Load() - v, found, certain := s.Lookup(hashOf(key), key, 1, false) + v, found, certain := s.Lookup(twoHashes(key), key, 1, false) if found && (v.a != key || v.c != v.a^v.b^sum) { t.Errorf("Lookup(%d) found the value %v", key, v) @@ -1479,10 +1523,10 @@ func TestConcurrentReaders(t *testing.T) { rng := rand.New(rand.NewPCG(7, 7)) for step := range steps { key := rng.IntN(keys) - idx := s.Find(hashOf(key), key) + idx := s.Find(twoHashes(key), key) switch { case idx == 0 && s.Len() < capacity: - s.PushFront(0, s.Insert(hashOf(key), key, valueOf(key, step))) + s.PushFront(0, s.Insert(twoHashes(key), key, valueOf(key, step))) present[key].Add(1) case idx != 0 && rng.IntN(3) == 0: s.Replace(idx, key, valueOf(key, step)) @@ -1535,6 +1579,7 @@ func TestPreferredSlots(t *testing.T) { const goroutines = 64 r := newReaders(1024) + s := &Slab[int, int]{readers: r} var ( wg, started sync.WaitGroup release = make(chan struct{}) @@ -1547,8 +1592,8 @@ func TestPreferredSlots(t *testing.T) { for range goroutines { started.Add(1) wg.Go(func() { - slot := r.preferred() - if again := r.preferred(); again != slot { + slot := s.preferred() + if again := s.preferred(); again != slot { t.Errorf("a goroutine prefers slot %d, and then slot %d", slot, again) } mu.Lock() diff --git a/internal/cslab/readers.go b/internal/cslab/readers.go index 4196548..dd68a4e 100644 --- a/internal/cslab/readers.go +++ b/internal/cslab/readers.go @@ -4,7 +4,6 @@ import ( "math/bits" "runtime" "sync/atomic" - "unsafe" ) // cacheLine is a size that no two CPUs' cache lines straddle on the @@ -86,12 +85,12 @@ type Slot struct { // pin is zero while the slot is free, and otherwise the name of the node // that its reader is looking at: the number of the slab in the upper // half, which is never zero, and the index of the node in the lower. - pin atomic.Uint64 + pin uint64 //nolint:modernize // See the package documentation. // hits counts the lookups that found their key with this slot and were // asked to say so; see [Slab.Lookup]. Whoever has used the slot has // added to it. It is in the line that a reader writes to anyway. - hits atomic.Uint64 + hits uint64 //nolint:modernize // See the package documentation. _ [cacheLine - 16]byte } @@ -123,54 +122,8 @@ func (r *Readers) name() uint64 { return uint64(r.slabs) << 32 } -// Pin announces that the caller is about to look at a node, and returns the -// slot that says so. The node is safe to look at only if it is in the index -// after Pin has returned: a slab that took the node out earlier may not have -// seen the pin. The caller clears the slot with [Slot.Unpin] when it is done -// with the node. -// -// Pin returns nil if the slot that the caller prefers is taken, which is -// rare. The caller should then try [Readers.PinAny]. -func (r *Readers) Pin(node uint64) *Slot { - slot := &r.slots[r.preferred()] - if slot.pin.CompareAndSwap(0, node) { - return slot - } - return nil -} - -// preferred returns the slot that the calling goroutine goes for first. -// -// A goroutine picks the same slot every time, which keeps the slot in the -// cache of the CPU it runs on. There is no way to ask which goroutine or CPU -// this is, but the whereabouts of the stack tell one goroutine from another: -// stacks are at least 2 KiB in size. The bits of the address below that say -// how deep into its stack a goroutine is, and are dropped. -func (r *Readers) preferred() uint64 { - var onStack byte - //nolint:gosec // The address is only hashed, never turned back into a pointer. - stack := uint64(uintptr(unsafe.Pointer(&onStack))) >> 11 - return (stack * 0x9e3779b97f4a7c15) >> r.shift -} - -// PinAny is Pin for a caller whose preferred slot is taken: it tries the -// slots after that one. It returns nil if those are taken as well, and the -// caller then has to do its reading under the lock of the slab instead. -// -// It is a function of its own so that Pin is small enough to be inlined. -func (r *Readers) PinAny(node uint64) *Slot { - i, mask := r.preferred(), uint64(len(r.slots)-1) - for range 3 { - i = (i + 1) & mask - if slot := &r.slots[i]; slot.pin.CompareAndSwap(0, node) { - return slot - } - } - return nil -} - // Unpin clears the slot. The node it named is no longer safe to look at. -func (s *Slot) Unpin() { s.pin.Store(0) } +func (s *Slot) Unpin() { atomic.StoreUint64(&s.pin, 0) } // Hits returns the number of lookups, by any slab of this Readers, that have // found their key and were asked to tally it. It looks at every slot, which @@ -179,7 +132,7 @@ func (s *Slot) Unpin() { s.pin.Store(0) } func (r *Readers) Hits() uint64 { var hits uint64 for i := range r.slots { - hits += r.slots[i].hits.Load() + hits += atomic.LoadUint64(&r.slots[i].hits) } return hits } @@ -196,7 +149,7 @@ func (r *Readers) Occupy(leave int) (release func()) { continue } // No slab goes by the name of zero, so this pins nothing. - if slot := &r.slots[i]; slot.pin.CompareAndSwap(0, 1) { + if slot := &r.slots[i]; atomic.CompareAndSwapUint64(&slot.pin, 0, 1) { taken = append(taken, slot) } } diff --git a/internal/ghost/ghost.go b/internal/ghost/ghost.go index 7dbd134..d85f048 100644 --- a/internal/ghost/ghost.go +++ b/internal/ghost/ghost.go @@ -1,15 +1,12 @@ // Package ghost provides the memory of a cache for keys it no longer holds: a // set that remembers what was added to it for a while and then forgets it. // -// All it keeps of a key is 63 bits of a hash, in sixteen bytes or so for each. +// All it keeps of a key is 63 bits of a hash, in twenty bytes or so for each. // Two keys with the same hash are the same key to it, which is rare enough // not to matter for what a cache does with the answer. package ghost -import ( - "math" - "math/bits" -) +import "math" // Set remembers the hashes that were added to it until as many more have been // added as it has room for. It does not allocate once it has been @@ -17,15 +14,16 @@ import ( type Set struct { // ring holds the hashes in the order in which they were added, and // starts over when it reaches the end. A hash has its highest bit set, - // so that zero can stand for a place that is free. The lower bits are - // the ones that say where a hash belongs in the index. + // so that zero can stand for a place that is free. Its lower 32 bits + // say where it belongs in the index. ring []uint64 next uint32 // the place in ring that the next hash goes to - // index is a linear-probing table, whose size is a power of two, of - // the places in ring, each plus one. Zero is an empty slot. + // index is a linear-probing table of size slots, of the places in ring, + // each plus one. Zero is an empty slot. A hash's probe starts at the slot + // that its lower 32 bits scaled to size point at. index []uint32 - mask uint32 + size uint32 count int @@ -37,10 +35,9 @@ type Set struct { // present is the bit that every hash in the ring has set. const present = 1 << 63 -// MaxCapacity is the largest capacity [Set.Init] accepts. It keeps the index -// addressable with 32 bits: that has between one and a half times and three -// times as many slots as the set has room, and twice as many at this -// capacity. +// MaxCapacity is the largest capacity [Set.Init] accepts. It keeps the index, +// which has three slots for every hash the set has room for, addressable with +// 32 bits. const MaxCapacity = 1 << 30 // Init readies the set to remember up to capacity hashes, and empties it. It @@ -50,14 +47,14 @@ func (s *Set) Init(capacity int) { panic("ghost: invalid capacity") } - // The smallest power of two above 1.5 times the capacity keeps the load - // factor at or below 2/3 and guarantees an empty slot, which is what - // ends an unsuccessful probe. - size := uint(1) << bits.Len(uint(capacity+capacity/2)) + // Three slots for every hash keep the load factor at or below a third, + // whatever the capacity, and guarantee an empty slot, which is what ends + // an unsuccessful probe. + size := max(3*uint(capacity), 1) s.ring = make([]uint64, capacity) s.index = make([]uint32, size) - s.mask = uint32(size - 1) + s.size = uint32(size) s.next, s.count = 0, 0 s.asked = nil } @@ -100,9 +97,9 @@ func (s *Set) Add(hash uint64) { if s.asked != nil { s.asked[s.next] = 0 } - i := uint32(hash) & s.mask + i := s.home(hash) for s.index[i] != 0 { - i = (i + 1) & s.mask + i = s.after(i) } s.index[i] = s.next + 1 s.count++ @@ -158,7 +155,7 @@ func (s *Set) Reset() { // find returns the slot of the index that refers to the hash. func (s *Set) find(hash uint64) (slot uint32, ok bool) { - for i := uint32(hash) & s.mask; ; i = (i + 1) & s.mask { + for i := s.home(hash); ; i = s.after(i) { place := s.index[i] if place == 0 { return 0, false @@ -172,17 +169,38 @@ func (s *Set) find(hash uint64) (slot uint32, ok bool) { // unindex empties a slot of the index, then closes the gap so that probe // sequences running through it stay unbroken. func (s *Set) unindex(hole uint32) { - index, mask := s.index, s.mask + index := s.index // Every entry between the hole and the next empty slot moves back into // the hole if that keeps it at or after its home slot. Distances are - // taken modulo the table size. - for i := (hole + 1) & mask; index[i] != 0; i = (i + 1) & mask { - home := uint32(s.ring[index[i]-1]) & mask - if (i-home)&mask >= (i-hole)&mask { + // taken around the end of the table. + for i := s.after(hole); index[i] != 0; i = s.after(i) { + home := s.home(s.ring[index[i]-1]) + fromHome, fromHole := i-home, i-hole + if i < home { + fromHome += s.size + } + if i < hole { + fromHole += s.size + } + if fromHome >= fromHole { index[hole] = index[i] hole = i } } index[hole] = 0 } + +// home returns the slot of the index that the probe for a hash starts at. +func (s *Set) home(hash uint64) uint32 { + return uint32(uint64(uint32(hash)) * uint64(s.size) >> 32) +} + +// after returns the slot that follows slot i, the first one after the last. +func (s *Set) after(i uint32) uint32 { + i++ + if i == s.size { + return 0 + } + return i +} diff --git a/internal/inlinecheck/inline_test.go b/internal/inlinecheck/inline_test.go index 4ae5255..d0fd5d4 100644 --- a/internal/inlinecheck/inline_test.go +++ b/internal/inlinecheck/inline_test.go @@ -31,11 +31,25 @@ var hot = regexp.MustCompile(`/(lru|twoq|sieve|s3fifo|tinylfu|stats)\.\(\*(Cache // slow matches the calls that must not show up in them: functions that are // small enough to be inlined, and are, as long as the compiler knows them. var slow = regexp.MustCompile(`^sync\.\(\*(RW)?Mutex\)\.|^sync/atomic\.|` + - `slab\.\(\*Slab\[.*\]\)\.(MoveToFront|PushFront|Unlink|Len|Cap|Overdue|Hash)$|` + - `cslab\.\(\*(Readers|Slot)\)\.(Pin|Unpin)$|/s3fifo\.(tagOf|ghostOf)$|` + + `slab\.\(\*Slab\[.*\]\)\.(MoveToFront|PushFront|Unlink|Len|Cap|Overdue|Hash|pin|preferred)$|` + + `cslab\.\(\*Node\[.*\]\)\.(Meta|SetMeta)$|cslab\.\(\*Slot\)\.Unpin$|/s3fifo\.(tagOf|ghostOf)$|` + `/tinylfu\.(tagOf|kept|keep|printOf|printIn)$|/tinylfu\.\(\*climber\)\.(hit|miss)$|` + `/stats\.\(\*Cache\[.*\]\)\.stripe$`) +// read matches the functions that a read without a lock goes through, and +// readSlow the calls that must not show up in them even where the compiler +// knows next to nothing: in a program that gets to the caches through a +// generic type of another package that instantiates nothing. The compiler +// inlines no function there that is not generic, so the reads have to do +// without any, this module's own included, but the atomic functions, which +// it builds in. A lock is taken only when a read cannot be sure, and calls +// to it are fine. +var ( + read = regexp.MustCompile(`/(sieve|s3fifo|tinylfu)\.\(\*Cache\[.*\]\)\.(Get|Peek)$|/cslab\.\(\*Slab\[.*\]\)\.Lookup$`) + readSlow = regexp.MustCompile(`^sync/atomic\.|^github\.com/floatdrop/evict/[^\[]*$|` + + `cslab\.\(\*Slab\[.*\]\)\.(Overdue|pin|preferred)$|cslab\.\(\*Node\[.*\]\)\.(Meta|SetMeta)$`) +) + func TestHotPathsAreInlined(t *testing.T) { t.Parallel() @@ -60,7 +74,8 @@ func TestHotPathsAreInlined(t *testing.T) { // -S makes the compiler print the code it generates for the package, // the instantiated methods of the caches included. // There is a package for each cache, so that none of them can count - // on what another one has passed on to the compiler. + // on what another one has passed on to the compiler, and one that uses + // the caches through a generic type of another package. //nolint:gosec // The command is the go tool, and its arguments are fixed. cmd := exec.CommandContext(t.Context(), goTool, "build", "-gcflags=-S", "./probe/...") // A build for another platform or with other flags would say nothing @@ -71,29 +86,46 @@ func TestHotPathsAreInlined(t *testing.T) { t.Fatalf("go build: %v\n%s", err, out) } - function, seen := "", map[string]bool{} + var ( + pkg, function string + seen, seenWrapped = map[string]bool{}, map[string]bool{} + ) scanner := bufio.NewScanner(bytes.NewReader(out)) scanner.Buffer(nil, 1<<20) for scanner.Scan() { line := scanner.Text() + // The output for a package starts with a line like + // # github.com/floatdrop/evict/internal/inlinecheck/probe/lru + if p, ok := strings.CutPrefix(line, "# "); ok { + pkg = p + continue + } + wrapped := strings.HasSuffix(pkg, "/probe/wrapuser") + // A function starts with a line like // pkg.(*T[go.shape.int]).Method STEXT dupok size=... if name, _, ok := strings.Cut(line, " STEXT "); ok && !strings.HasPrefix(line, "\t") { function = name - if hot.MatchString(function) { - seen[hot.FindStringSubmatch(function)[0]] = true + switch { + case wrapped && read.MatchString(function): + seenWrapped[read.FindString(function)] = true + case !wrapped && hot.MatchString(function): + seen[hot.FindString(function)] = true } continue } // A call in it looks like // 0x0040 00064 (file.go:12) CALL sync.(*Mutex).Lock(SB) _, target, ok := strings.Cut(line, "\tCALL\t") - if !ok || !hot.MatchString(function) { + if !ok { continue } target = strings.TrimSuffix(target, "(SB)") - if slow.MatchString(target) { + switch { + case wrapped && read.MatchString(function) && readSlow.MatchString(target): + t.Errorf("%s calls %s when the cache is used through a generic type", function, target) + case !wrapped && hot.MatchString(function) && slow.MatchString(target): t.Errorf("%s calls %s instead of inlining it", function, target) } } @@ -113,4 +145,21 @@ func TestHotPathsAreInlined(t *testing.T) { } } } + for _, want := range [][2]string{ + {"sieve.(*Cache[", "Get"}, + {"sieve.(*Cache[", "Peek"}, + {"s3fifo.(*Cache[", "Get"}, + {"s3fifo.(*Cache[", "Peek"}, + {"tinylfu.(*Cache[", "Get"}, + {"tinylfu.(*Cache[", "Peek"}, + {"cslab.(*Slab[", "Lookup"}, + } { + found := false + for name := range seenWrapped { + found = found || strings.Contains(name, "/"+want[0]) && strings.HasSuffix(name, ")."+want[1]) + } + if !found { + t.Errorf("the compiler's output for the generic wrapper has no code for %s%s", want[0], want[1]) + } + } } diff --git a/internal/inlinecheck/probe/wrap/wrap.go b/internal/inlinecheck/probe/wrap/wrap.go new file mode 100644 index 0000000..0176f61 --- /dev/null +++ b/internal/inlinecheck/probe/wrap/wrap.go @@ -0,0 +1,35 @@ +// Package wrap holds the caches that read without a lock in a generic type of +// its own, as a program may, and instantiates nothing. Package wrapuser does, +// so the methods of the caches are compiled there, by a compiler that knows +// only what this package has passed on, which is little. +package wrap + +import ( + "github.com/floatdrop/evict/s3fifo" + "github.com/floatdrop/evict/sieve" + "github.com/floatdrop/evict/tinylfu" +) + +// Caches holds a cache of each kind. +type Caches[K comparable, V any] struct { + Sieve *sieve.Cache[K, V] + S3FIFO *s3fifo.Cache[K, V] + TinyLFU *tinylfu.Cache[K, V] +} + +// Read gets and peeks at key in every cache, and returns how often it was +// found. +func (c Caches[K, V]) Read(key K) (found int) { + for _, ok := range []bool{ + has(c.Sieve.Get(key)), has(c.Sieve.Peek(key)), + has(c.S3FIFO.Get(key)), has(c.S3FIFO.Peek(key)), + has(c.TinyLFU.Get(key)), has(c.TinyLFU.Peek(key)), + } { + if ok { + found++ + } + } + return found +} + +func has[V any](_ V, ok bool) bool { return ok } diff --git a/internal/inlinecheck/probe/wrapuser/wrapuser.go b/internal/inlinecheck/probe/wrapuser/wrapuser.go new file mode 100644 index 0000000..8e09ce1 --- /dev/null +++ b/internal/inlinecheck/probe/wrapuser/wrapuser.go @@ -0,0 +1,14 @@ +// Package wrapuser uses the caches through package wrap, with key and value +// types of its own, and imports nothing else. +package wrapuser + +import "github.com/floatdrop/evict/internal/inlinecheck/probe/wrap" + +// Key is a key type that only this package instantiates the caches with. +type Key struct{ Tenant, ID string } + +// Value is a value type that only this package instantiates the caches with. +type Value struct{ Size, Hits int } + +// Use keeps the compiler from discarding the methods of the caches. +func Use(c wrap.Caches[Key, Value], k Key) int { return c.Read(k) } diff --git a/internal/shards/shards.go b/internal/shards/shards.go index 00b086c..6812936 100644 --- a/internal/shards/shards.go +++ b/internal/shards/shards.go @@ -24,9 +24,12 @@ const ( minCapacity = 256 ) -// Pad is placed at the end of a shard so that the fields of two neighbors, -// which are locked and written independently, never share a cache line. -type Pad [128]byte +// Line is the size of a cache line on Apple's chips, and of the pair of lines +// that Intel's chips fetch together. +const Line = 128 + +// Pad keeps fields that are written independently off each other's lines. +type Pad [Line]byte // Count returns the number of shards for a cache of the given capacity: a // power of two, so that a shard can be picked with a mask. diff --git a/internal/slab/slab.go b/internal/slab/slab.go index 7119d9e..2224157 100644 --- a/internal/slab/slab.go +++ b/internal/slab/slab.go @@ -10,18 +10,14 @@ // A Slab is not safe for concurrent use. Its owner serializes all access. package slab -import "math/bits" - // A note on how this package is written. Its methods are generic, so they are // compiled into the packages that use the caches, and the compiler inlines a // function there only if it has seen its body. It has not seen the bodies of // small helpers that are not generic themselves, which is why the hot paths // below spell out their arithmetic instead of calling such helpers. -// MaxCapacity is the largest capacity [Slab.Init] accepts. It keeps the index -// addressable with 32 bits: that has between one and a half times and three -// times as many slots as the slab has entries, and twice as many at this -// capacity. +// MaxCapacity is the largest capacity [Slab.Init] accepts. It keeps the index, +// which has three slots for every entry, addressable with 32 bits. const MaxCapacity = 1 << 30 // maxHeads is the largest number of list heads [Slab.Init] accepts. @@ -54,12 +50,13 @@ type Slab[K comparable, V any] struct { // Nodes holds the list heads followed by the entries. Nodes []Node[K, V] - // slots is the hash index: a linear-probing table whose size is a power - // of two. A slot holds the hash of an entry in its high half and the - // index of the entry's node in its low half. Zero is an empty slot: no - // entry lives in node 0. + // slots is the hash index: a linear-probing table of size slots. A slot + // holds the hash of an entry in its high half and the index of the + // entry's node in its low half. Zero is an empty slot: no entry lives in + // node 0. An entry's probe starts at the slot that its hash scaled to + // size points at, which spreads the hashes over a table of any size. slots []uint64 - mask uint32 + size uint32 heads uint32 // number of list heads free uint32 // most recently removed node, linked through Next; 0 if none @@ -68,12 +65,10 @@ type Slab[K comparable, V any] struct { } // indexSize returns the number of slots in the index of a slab with the given -// capacity: the smallest power of two above 1.5 times the capacity. That -// keeps the load factor at or below 2/3 and guarantees an empty slot, which -// is what ends an unsuccessful probe. -func indexSize(capacity int) uint { - return 1 << bits.Len(uint(capacity+capacity/2)) -} +// capacity: three for every entry, and one at least. That keeps the load +// factor at or below a third, whatever the capacity, and guarantees an empty +// slot, which is what ends an unsuccessful probe. +func indexSize(capacity int) uint { return max(3*uint(capacity), 1) } // Init readies the slab for capacity entries and the given number of list // heads, and leaves every list empty. It panics unless capacity lies in @@ -85,7 +80,7 @@ func (s *Slab[K, V]) Init(capacity, heads int) { s.Nodes = make([]Node[K, V], heads+capacity) s.slots = make([]uint64, indexSize(capacity)) - s.mask = uint32(len(s.slots) - 1) + s.size = uint32(len(s.slots)) s.heads = uint32(heads) s.resetLists() } @@ -106,8 +101,8 @@ func (s *Slab[K, V]) Cap() int { return len(s.Nodes) - int(s.heads) } // Find returns the index of the node that holds key, or 0 if there is none. // The hash must be the one the key was inserted with. func (s *Slab[K, V]) Find(hash uint32, key K) uint32 { - slots, mask := s.slots, s.mask - for i := hash & mask; ; i = (i + 1) & mask { + slots, size := s.slots, s.size + for i := uint32(uint64(hash) * uint64(size) >> 32); ; { slot := slots[i] if slot == 0 { return 0 @@ -117,6 +112,10 @@ func (s *Slab[K, V]) Find(hash uint32, key K) uint32 { return idx } } + i++ + if i == size { + i = 0 + } } } @@ -145,10 +144,13 @@ func (s *Slab[K, V]) Insert(hash uint32, key K, value V) uint32 { n.Value = value s.count++ - slots, mask := s.slots, s.mask - i := hash & mask + slots, size := s.slots, s.size + i := uint32(uint64(hash) * uint64(size) >> 32) for slots[i] != 0 { - i = (i + 1) & mask + i++ + if i == size { + i = 0 + } } slots[i] = uint64(hash)<<32 | uint64(idx) @@ -176,9 +178,9 @@ func (s *Slab[K, V]) Remove(idx uint32) { // unindex empties the slot that refers to node idx, then closes the gap so // that probe sequences running through it stay unbroken. func (s *Slab[K, V]) unindex(hash, idx uint32) { - slots, mask := s.slots, s.mask + slots, size := s.slots, s.size - hole := hash & mask + hole := uint32(uint64(hash) * uint64(size) >> 32) for { slot := slots[hole] if slot == 0 { @@ -187,16 +189,34 @@ func (s *Slab[K, V]) unindex(hash, idx uint32) { if slot&(1<<32-1) == uint64(idx) { break } - hole = (hole + 1) & mask + hole++ + if hole == size { + hole = 0 + } } // Every entry between the hole and the next empty slot moves back into // the hole if that keeps it at or after its home slot. Distances are - // taken modulo the table size. - for i := (hole + 1) & mask; slots[i] != 0; i = (i + 1) & mask { - home := uint32(slots[i]>>32) & mask - if (i-home)&mask >= (i-hole)&mask { - slots[hole] = slots[i] + // taken around the end of the table. + for i := hole; ; { + i++ + if i == size { + i = 0 + } + slot := slots[i] + if slot == 0 { + break + } + home := uint32((slot >> 32) * uint64(size) >> 32) + fromHome, fromHole := i-home, i-hole + if i < home { + fromHome += size + } + if i < hole { + fromHole += size + } + if fromHome >= fromHole { + slots[hole] = slot hole = i } } @@ -210,9 +230,15 @@ func (s *Slab[K, V]) unindex(hash, idx uint32) { func (s *Slab[K, V]) MaxDisplacement() int { longest := uint32(0) for i, slot := range s.slots { - if slot != 0 { - longest = max(longest, (uint32(i)-uint32(slot>>32))&s.mask) + if slot == 0 { + continue + } + at, home := uint32(i), uint32((slot>>32)*uint64(s.size)>>32) + distance := at - home + if at < home { + distance += s.size } + longest = max(longest, distance) } return int(longest) } diff --git a/internal/slab/slab_test.go b/internal/slab/slab_test.go index bc78760..307e0ee 100644 --- a/internal/slab/slab_test.go +++ b/internal/slab/slab_test.go @@ -107,6 +107,12 @@ func mustPanic(t *testing.T, what string, f func()) { f() } +// homeAt returns the lowest hash whose home is the given slot of an index +// with size slots, for tests that want entries in particular places. +func homeAt(size, slot uint32) uint32 { + return uint32((uint64(slot)<<32 + uint64(size) - 1) / uint64(size)) +} + func TestIndexSize(t *testing.T) { t.Parallel() @@ -115,16 +121,11 @@ func TestIndexSize(t *testing.T) { want uint }{ {0, 1}, - {1, 2}, - {2, 4}, - {3, 8}, - {5, 8}, - {6, 16}, - {1000, 2048}, - {1365, 2048}, - {1366, 4096}, + {1, 3}, + {2, 6}, + {1000, 3000}, // The largest index still has slots that 32 bits can address. - {MaxCapacity, 1 << 31}, + {MaxCapacity, 3 << 30}, } for _, tt := range tests { got := indexSize(tt.capacity) @@ -132,9 +133,8 @@ func TestIndexSize(t *testing.T) { t.Errorf("indexSize(%d) = %d, want %d", tt.capacity, got, tt.want) } // An empty slot is what ends a probe for a missing key, and the - // load factor stays at or below 2/3. Twice the largest index is - // more than 32 bits hold. - if 2*uint64(got) < 3*uint64(tt.capacity) || got <= uint(tt.capacity) { + // load factor stays at or below a third. + if got < 3*uint(tt.capacity) || got <= uint(tt.capacity) { t.Errorf("indexSize(%d) = %d is too small", tt.capacity, got) } } @@ -245,15 +245,16 @@ func TestInsertFindRemove(t *testing.T) { func TestFill(t *testing.T) { t.Parallel() - const capacity = 1365 // 2048 slots, of which two thirds get used. - - // Many keys share a hash, and the hashes crowd into one end of the index. - hashOf := func(key int) uint32 { return uint32(key % 300) } + const capacity = 1365 // 4095 slots, of which a third get used. var s Slab[int, int] s.Init(capacity, 2) want := map[int]int{} + // Many keys share a hash, and the hashes crowd into one end of the index. + size := uint32(len(s.slots)) + hashOf := func(key int) uint32 { return homeAt(size, uint32(key%300)) } + for round := range 3 { for k := range capacity { s.Insert(hashOf(k), k, k+round) @@ -285,7 +286,8 @@ func TestMaxDisplacement(t *testing.T) { t.Parallel() var s Slab[int, int] - s.Init(40, 1) // 64 slots. + s.Init(40, 1) // 120 slots. + size := uint32(len(s.slots)) if got := s.MaxDisplacement(); got != 0 { t.Errorf("MaxDisplacement() = %d on an empty slab", got) @@ -293,7 +295,7 @@ func TestMaxDisplacement(t *testing.T) { // Entries that sit in their home slots are not displaced. for k := range 10 { - s.Insert(uint32(k), k, k) + s.Insert(homeAt(size, uint32(k)), k, k) } if got := s.MaxDisplacement(); got != 0 { t.Errorf("MaxDisplacement() = %d without collisions", got) @@ -302,7 +304,7 @@ func TestMaxDisplacement(t *testing.T) { // Five entries that want the last slot. One gets it; the others wrap // around and land behind the ten entries above, in slots 10 to 13. for k := 100; k < 105; k++ { - s.Insert(63, k, k) + s.Insert(homeAt(size, size-1), k, k) } if got := s.MaxDisplacement(); got != 14 { t.Errorf("MaxDisplacement() = %d, want 14", got) @@ -364,15 +366,19 @@ func TestRemovePanics(t *testing.T) { func TestCollisions(t *testing.T) { t.Parallel() - const capacity = 40 // 64 slots. + const ( + capacity = 40 + size = 3 * capacity // slots + ) + last := homeAt(size, size-1) hashes := []uint32{ 0, 0, 0, // Equal hashes: only the keys tell the entries apart. - 63, 63, 63, 63, // Runs that start in the last slot and wrap. - 62, 61, - 63 + 64, 63 + 128, // The same home slot under different hashes. - 1 << 31, 1<<31 + 63, 1<<32 - 1, - 5, 5 + 64, 6, 7, 7, + last, last, last, last, // Runs that start in the last slot and wrap. + homeAt(size, size-2), homeAt(size, size-3), + last + 1, 1<<32 - 1, // The same home slot under different hashes. + homeAt(size, size/2), homeAt(size, size/2) + 1, + homeAt(size, 5), homeAt(size, 5) + 1, homeAt(size, 6), homeAt(size, 7), homeAt(size, 7), } hashOf := func(key int) uint32 { return hashes[key%len(hashes)] } diff --git a/lru/lru.go b/lru/lru.go index fef0d7c..0762897 100644 --- a/lru/lru.go +++ b/lru/lru.go @@ -14,6 +14,7 @@ import ( "iter" "slices" "sync" + "unsafe" "github.com/floatdrop/evict/internal/shards" "github.com/floatdrop/evict/internal/slab" @@ -29,7 +30,7 @@ import ( type Cache[K comparable, V any] struct { seed maphash.Seed mask uint32 // number of shards minus one - shards []shard[K, V] + shards []padded[K, V] capacity int } @@ -39,8 +40,14 @@ type shard[K comparable, V any] struct { // The entries, linked from the most to the least recently used. slab slab.Slab[K, V] +} - _ shards.Pad +// padded is a shard followed by a line or more of padding, so that writers to +// it and readers of the next shard never share a line, and rounded up to whole +// lines, so that every shard starts at the same place in one. +type padded[K comparable, V any] struct { + shard[K, V] + _ [shards.Line + (shards.Line-unsafe.Sizeof(shard[K, V]{})%shards.Line)%shards.Line]byte } // queue is the list head of a shard's entries. @@ -89,7 +96,7 @@ func New[K comparable, V any](capacity int, opts ...Option) *Cache[K, V] { c := &Cache[K, V]{ seed: maphash.MakeSeed(), mask: uint32(n - 1), - shards: make([]shard[K, V], n), + shards: make([]padded[K, V], n), capacity: capacity, } for i := range c.shards { diff --git a/lru/shards_test.go b/lru/shards_test.go index a4e9a0c..500fa4b 100644 --- a/lru/shards_test.go +++ b/lru/shards_test.go @@ -100,10 +100,10 @@ func TestHashSplit(t *testing.T) { } // TestShardPadding checks that the shards of a cache keep out of each other's -// cache lines. +// cache lines and take up whole lines, whatever the keys and values. func TestShardPadding(t *testing.T) { t.Parallel() - cachetest.Padded(t, shard[int, int]{}) - cachetest.Padded(t, shard[string, []byte]{}) + cachetest.Padded(t, Cache[int, int]{}.shards) + cachetest.Padded(t, Cache[string, []byte]{}.shards) } diff --git a/s3fifo/s3fifo.go b/s3fifo/s3fifo.go index 446ab98..2fb31dd 100644 --- a/s3fifo/s3fifo.go +++ b/s3fifo/s3fifo.go @@ -85,7 +85,7 @@ // nothing that would give Go the occasion to run another goroutine in its // place. // -// Of a ghost the cache keeps a hash of the key and nothing else: sixteen +// Of a ghost the cache keeps a hash of the key and nothing else: twenty // bytes or so, for nine tenths as many ghosts as there are entries unless // [WithGhostRatio] says otherwise. The key itself is let go like the rest of // the entry. @@ -104,6 +104,7 @@ import ( "runtime" "slices" "sync" + "unsafe" "github.com/floatdrop/evict/internal/cslab" "github.com/floatdrop/evict/internal/ghost" @@ -124,7 +125,7 @@ import ( type Cache[K comparable, V any] struct { seed maphash.Seed mask uint32 // number of shards minus one - shards []shard[K, V] + shards []padded[K, V] readers *cslab.Readers capacity int } @@ -160,8 +161,14 @@ type shard[K comparable, V any] struct { // cleared. Until then, new entries are not all sent through the small // queue; see set. evicted bool +} - _ shards.Pad +// padded is a shard followed by a line or more of padding, so that writers to +// it and readers of the next shard never share a line, and rounded up to whole +// lines, so that every shard starts at the same place in one. +type padded[K comparable, V any] struct { + shard[K, V] + _ [shards.Line + (shards.Line-unsafe.Sizeof(shard[K, V]{})%shards.Line)%shards.Line]byte } // The queues of a shard. The numbers are the list heads in the slab as well @@ -248,10 +255,10 @@ func WithSmallRatio(ratio float64) Option { // // The more ghosts, the longer a key may stay away and still be recognized // when it comes back, which is what tells an entry that is asked for every -// now and then from one that is new. A ghost takes about sixteen bytes, so a -// ratio of 6 costs about a hundred bytes for every entry. With a ratio of 0 -// nothing is remembered, and an entry gets to the main queue only by being -// read in the small one. +// now and then from one that is new. A ghost takes about twenty bytes, so a +// ratio of 6 costs about a hundred and twenty bytes for every entry. With a +// ratio of 0 nothing is remembered, and an entry gets to the main queue only +// by being read in the small one. // // The ratio is brought into the range from 0 to 8 if it is outside, and is 0 // if it is not a number. The number for a shard is rounded down to whole @@ -315,7 +322,7 @@ func New[K comparable, V any](capacity int, opts ...Option) *Cache[K, V] { c := &Cache[K, V]{ seed: maphash.MakeSeed(), mask: uint32(n - 1), - shards: make([]shard[K, V], n), + shards: make([]padded[K, V], n), readers: cslab.NewReaders(), capacity: capacity, } @@ -365,7 +372,7 @@ func (c *Cache[K, V]) Get(key K) (value V, ok bool) { s.mu.Lock() if idx := s.slab.Find(hash, key); idx != 0 { n := &s.slab.Nodes[idx] - n.Meta.Store(min(n.Meta.Load()+1, maxFrequency)) + n.SetMeta(min(n.Meta()+1, maxFrequency)) value, ok = n.Value, true } s.mu.Unlock() @@ -445,7 +452,7 @@ func (s *shard[K, V]) set(h uint64, key K, value V) (oldKey K, oldValue V, displ // Readers may be looking at the entry, so it gets its new value // in another node, which takes over its place in its queue. n = &sl.Nodes[sl.Replace(idx, key, value)] - n.Meta.Store(min(n.Meta.Load()+1, maxFrequency)) + n.SetMeta(min(n.Meta()+1, maxFrequency)) return oldKey, oldValue, true } @@ -501,8 +508,8 @@ func (s *shard[K, V]) evict() (key K, value V) { sl.Unlink(idx) s.smalls-- - if n.Meta.Load() >= s.promote { - n.Meta.Store(0) + if n.Meta() >= s.promote { + n.SetMeta(0) links[idx].Tag |= main sl.PushFront(main, idx) s.mains++ @@ -530,11 +537,11 @@ func (s *shard[K, V]) evict() (key K, value V) { for range maxFrequency * s.mains { idx := links[main].Prev n := &nodes[idx] - f := n.Meta.Load() + f := n.Meta() if f == 0 { break } - n.Meta.Store(f - 1) + n.SetMeta(f - 1) sl.Unlink(idx) sl.PushFront(main, idx) } diff --git a/s3fifo/shards_test.go b/s3fifo/shards_test.go index 978dd44..95ddff9 100644 --- a/s3fifo/shards_test.go +++ b/s3fifo/shards_test.go @@ -231,7 +231,7 @@ func TestBookkeeping(t *testing.T) { if got := s.slab.Links[idx].Tag & 1; got != head { t.Fatalf("node %d is in queue %d but tagged for queue %d", idx, head, got) } - if f := s.slab.Nodes[idx].Meta.Load(); f > maxFrequency { + if f := s.slab.Nodes[idx].Meta(); f > maxFrequency { t.Fatalf("node %d has counted %d reads, want at most %d", idx, f, maxFrequency) } n++ @@ -338,10 +338,10 @@ func TestGhostOf(t *testing.T) { } // TestShardPadding checks that the shards of a cache keep out of each other's -// cache lines. +// cache lines and take up whole lines, whatever the keys and values. func TestShardPadding(t *testing.T) { t.Parallel() - cachetest.Padded(t, shard[int, int]{}) - cachetest.Padded(t, shard[string, []byte]{}) + cachetest.Padded(t, Cache[int, int]{}.shards) + cachetest.Padded(t, Cache[string, []byte]{}.shards) } diff --git a/sieve/shards_test.go b/sieve/shards_test.go index 4846c40..012592b 100644 --- a/sieve/shards_test.go +++ b/sieve/shards_test.go @@ -100,10 +100,10 @@ func TestHashSplit(t *testing.T) { } // TestShardPadding checks that the shards of a cache keep out of each other's -// cache lines. +// cache lines and take up whole lines, whatever the keys and values. func TestShardPadding(t *testing.T) { t.Parallel() - cachetest.Padded(t, shard[int, int]{}) - cachetest.Padded(t, shard[string, []byte]{}) + cachetest.Padded(t, Cache[int, int]{}.shards) + cachetest.Padded(t, Cache[string, []byte]{}.shards) } diff --git a/sieve/sieve.go b/sieve/sieve.go index e07983b..bf98b46 100644 --- a/sieve/sieve.go +++ b/sieve/sieve.go @@ -68,6 +68,7 @@ import ( "runtime" "slices" "sync" + "unsafe" "github.com/floatdrop/evict/internal/cslab" "github.com/floatdrop/evict/internal/shards" @@ -87,7 +88,7 @@ import ( type Cache[K comparable, V any] struct { seed maphash.Seed mask uint32 // number of shards minus one - shards []shard[K, V] + shards []padded[K, V] readers *cslab.Readers capacity int } @@ -105,8 +106,14 @@ type shard[K comparable, V any] struct { // hand is the entry that is next in line for eviction, or zero if that // is the oldest entry. hand uint32 +} - _ shards.Pad +// padded is a shard followed by a line or more of padding, so that writers to +// it and readers of the next shard never share a line, and rounded up to whole +// lines, so that every shard starts at the same place in one. +type padded[K comparable, V any] struct { + shard[K, V] + _ [shards.Line + (shards.Line-unsafe.Sizeof(shard[K, V]{})%shards.Line)%shards.Line]byte } // queue is the list head of a shard's entries. @@ -161,7 +168,7 @@ func New[K comparable, V any](capacity int, opts ...Option) *Cache[K, V] { c := &Cache[K, V]{ seed: maphash.MakeSeed(), mask: uint32(n - 1), - shards: make([]shard[K, V], n), + shards: make([]padded[K, V], n), readers: cslab.NewReaders(), capacity: capacity, } @@ -197,7 +204,7 @@ func (c *Cache[K, V]) Get(key K) (value V, ok bool) { s.mu.Lock() if idx := s.slab.Find(hash, key); idx != 0 { n := &s.slab.Nodes[idx] - n.Meta.Store(visited) + n.SetMeta(visited) value, ok = n.Value, true } s.mu.Unlock() @@ -270,7 +277,7 @@ func (s *shard[K, V]) set(hash uint32, key K, value V) (oldKey K, oldValue V, di // Readers may be looking at the entry, so it gets its new value // in another node, which takes over its place in the queue. to := sl.Replace(idx, key, value) - sl.Nodes[to].Meta.Store(visited) + sl.Nodes[to].SetMeta(visited) if s.hand == idx { s.hand = to } @@ -307,10 +314,10 @@ func (s *shard[K, V]) victim() uint32 { // round. But readers keep marking entries while it moves, so it settles // for wherever it is after two. for range 2 * s.slab.Len() { - if nodes[idx].Meta.Load() != visited { + if nodes[idx].Meta() != visited { break } - nodes[idx].Meta.Store(0) + nodes[idx].SetMeta(0) idx = links[idx].Prev if idx == queue { idx = links[queue].Prev diff --git a/tinylfu/export_test.go b/tinylfu/export_test.go index 0bfe56d..9e232c6 100644 --- a/tinylfu/export_test.go +++ b/tinylfu/export_test.go @@ -92,7 +92,7 @@ func (c *Cache[K, V]) Reads(key K) (reads uint32, ok bool) { if idx == 0 { return 0, false } - return s.slab.Nodes[idx].Meta.Load(), true + return s.slab.Nodes[idx].Meta(), true } // Window returns the number of entries that the small queue of the first diff --git a/tinylfu/shards_test.go b/tinylfu/shards_test.go index 1849741..cd6492e 100644 --- a/tinylfu/shards_test.go +++ b/tinylfu/shards_test.go @@ -404,7 +404,7 @@ func TestBookkeeping(t *testing.T) { if got := tag & 1; got != head { t.Fatalf("node %d is in queue %d but tagged for queue %d", idx, head, got) } - if reads := s.slab.Nodes[idx].Meta.Load(); reads > maxCount { + if reads := s.slab.Nodes[idx].Meta(); reads > maxCount { t.Fatalf("node %d has counted %d reads, want at most %d", idx, reads, maxCount) } // What the main queue leaves an entry with is one less than @@ -551,10 +551,10 @@ func TestTags(t *testing.T) { } // TestShardPadding checks that the shards of a cache keep out of each other's -// cache lines. +// cache lines and take up whole lines, whatever the keys and values. func TestShardPadding(t *testing.T) { t.Parallel() - cachetest.Padded(t, shard[int, int]{}) - cachetest.Padded(t, shard[string, []byte]{}) + cachetest.Padded(t, Cache[int, int]{}.shards) + cachetest.Padded(t, Cache[string, []byte]{}.shards) } diff --git a/tinylfu/tinylfu.go b/tinylfu/tinylfu.go index 8d4799c..31eee3b 100644 --- a/tinylfu/tinylfu.go +++ b/tinylfu/tinylfu.go @@ -82,6 +82,7 @@ import ( "runtime" "slices" "sync" + "unsafe" "github.com/floatdrop/evict/internal/cslab" "github.com/floatdrop/evict/internal/shards" @@ -102,7 +103,7 @@ import ( type Cache[K comparable, V any] struct { seed maphash.Seed mask uint32 // number of shards minus one - shards []shard[K, V] + shards []padded[K, V] readers *cslab.Readers capacity int @@ -144,8 +145,14 @@ type shard[K comparable, V any] struct { win *window hits, misses uint64 batch uint64 +} - _ shards.Pad +// padded is a shard followed by a line or more of padding, so that writers to +// it and readers of the next shard never share a line, and rounded up to whole +// lines, so that every shard starts at the same place in one. +type padded[K comparable, V any] struct { + shard[K, V] + _ [shards.Line + (shards.Line-unsafe.Sizeof(shard[K, V]{})%shards.Line)%shards.Line]byte } // The queues of a shard. The numbers are the list heads in the slab as well @@ -244,7 +251,7 @@ func New[K comparable, V any](capacity int, opts ...Option) *Cache[K, V] { c := &Cache[K, V]{ seed: maphash.MakeSeed(), mask: uint32(n - 1), - shards: make([]shard[K, V], n), + shards: make([]padded[K, V], n), readers: cslab.NewReaders(), capacity: capacity, } @@ -291,7 +298,7 @@ func (c *Cache[K, V]) Get(key K) (value V, ok bool) { s.mu.Lock() if idx := s.slab.Find(hash, key); idx != 0 { n := &s.slab.Nodes[idx] - n.Meta.Store(min(n.Meta.Load()+1, maxCount)) + n.SetMeta(min(n.Meta()+1, maxCount)) value, ok = n.Value, true s.hits++ } @@ -371,7 +378,7 @@ func (s *shard[K, V]) set(h uint64, key K, value V) (oldKey K, oldValue V, displ // Readers may be looking at the entry, so it gets its new value // in another node, which takes over its place in its queue. n = &sl.Nodes[sl.Replace(idx, key, value)] - n.Meta.Store(min(n.Meta.Load()+1, maxCount)) + n.SetMeta(min(n.Meta()+1, maxCount)) s.hits++ return oldKey, oldValue, true } @@ -420,14 +427,14 @@ func (s *shard[K, V]) look(idx uint32) (count uint32) { n := &s.slab.Nodes[idx] link := &s.slab.Links[idx] before := kept(link.Tag) - reads := n.Meta.Load() + reads := n.Meta() if reads == 0 { // Nothing to tell, and nothing to write to the entry either. return before } // Readers do not wait for this. One that counts between the line // above and the next is not counted, which is close enough. - n.Meta.Store(0) + n.SetMeta(0) count = min(before+reads, maxCount) s.seen.Add(printIn(s.slab.Hash(idx), link.Tag), int(count-before)) diff --git a/twoq/shards_test.go b/twoq/shards_test.go index 7414a14..d018d84 100644 --- a/twoq/shards_test.go +++ b/twoq/shards_test.go @@ -214,10 +214,10 @@ func TestHashSplit(t *testing.T) { } // TestShardPadding checks that the shards of a cache keep out of each other's -// cache lines. +// cache lines and take up whole lines, whatever the keys and values. func TestShardPadding(t *testing.T) { t.Parallel() - cachetest.Padded(t, shard[int, int]{}) - cachetest.Padded(t, shard[string, []byte]{}) + cachetest.Padded(t, Cache[int, int]{}.shards) + cachetest.Padded(t, Cache[string, []byte]{}.shards) } diff --git a/twoq/twoq.go b/twoq/twoq.go index 67c5fe7..c149a36 100644 --- a/twoq/twoq.go +++ b/twoq/twoq.go @@ -41,6 +41,7 @@ import ( "math" "slices" "sync" + "unsafe" "github.com/floatdrop/evict/internal/shards" "github.com/floatdrop/evict/internal/slab" @@ -56,7 +57,7 @@ import ( type Cache[K comparable, V any] struct { seed maphash.Seed mask uint32 // number of shards minus one - shards []shard[K, V] + shards []padded[K, V] capacity int } @@ -74,8 +75,14 @@ type shard[K comparable, V any] struct { capacity int // entries in the recent and the frequent queue together recentCap int // length of the recent queue above which it is the one to evict ghostCap int // keys to remember +} - _ shards.Pad +// padded is a shard followed by a line or more of padding, so that writers to +// it and readers of the next shard never share a line, and rounded up to whole +// lines, so that every shard starts at the same place in one. +type padded[K comparable, V any] struct { + shard[K, V] + _ [shards.Line + (shards.Line-unsafe.Sizeof(shard[K, V]{})%shards.Line)%shards.Line]byte } // The lists of a shard. The numbers are the list heads in the slab as well as @@ -184,7 +191,7 @@ func New[K comparable, V any](capacity int, opts ...Option) *Cache[K, V] { c := &Cache[K, V]{ seed: maphash.MakeSeed(), mask: uint32(n - 1), - shards: make([]shard[K, V], n), + shards: make([]padded[K, V], n), capacity: capacity, } for i := range c.shards {