From 7450977f1b213c5def985470b761a0a7a1f22ed2 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 8 Jul 2025 19:27:35 -0700 Subject: [PATCH 01/30] Compute present/absent/range test values on the fly. This changes what the benchmarks measure, so results are not comparable. --- bench_test.go | 293 ++++++++++++++++---------------------------------- kv_test.go | 226 +++++++++++++++++++++++++------------- 2 files changed, 244 insertions(+), 275 deletions(-) diff --git a/bench_test.go b/bench_test.go index f841884..d192ef4 100644 --- a/bench_test.go +++ b/bench_test.go @@ -2,7 +2,6 @@ package kv_test import ( "bufio" - "bytes" "encoding/binary" "fmt" "math" @@ -28,16 +27,6 @@ import ( const ( benchMeanRandomKeyLen = 8 - // The minimum number of keys to benchmark when stores must be cloned after exhausting the keys. - // i.e., don't benchmark if we will need to clone the store every N operations and N < benchMinNumMutableKeys. - benchMinNumMutableKeys = 1 << 10 - - // The maximum size of created absent key slices, 256K. - genAbsentMaxSize = 1 << 18 - - // The maximum size of created bounds slices, 64K. - genBoundsMaxSize = 1 << 16 - // Only the lowercase characters a-z and newlines appear in this file. filenameWords = "testdata/words_alpha.txt" ) @@ -78,16 +67,32 @@ func randomKey(meanLen int, random *rand.Rand) []byte { return randomBytes(int(math.Round(val)), random) } -func randomFixedLengthKey(keyLen int, random *rand.Rand) []byte { - return randomBytes(keyLen, random) -} - func shuffle[S ~[]E, E any](slice S, random *rand.Rand) { random.Shuffle(len(slice), func(i, j int) { slice[i], slice[j] = slice[j], slice[i] }) } +// Returns a function which repeatedly loops over the elements of itr, +// invoking reset after every full iteration. +func repeat[V any](s []V, reset func()) func() V { + if len(s) == 0 { + panic("cannot repeat empty") + } + i := 0 + return func() V { + value := s[i] + i++ + if i == len(s) { + i = 0 + if reset != nil { + reset() + } + } + return value + } +} + func BenchmarkTraverser(b *testing.B) { benchTraverser(b, "kind=pre-order", kv.TestingPreOrder) benchTraverser(b, "kind=post-order", kv.TestingPostOrder) @@ -271,105 +276,15 @@ func entriesFromFile(filename string) map[string]byte { return entries } -func createPresent(entries map[string]byte, random *rand.Rand) keySet { - present := keySet{} - for k := range entries { - present = append(present, []byte(k)) - } - slices.SortFunc(present, bytes.Compare) - shuffle(present, random) - return present -} - -func createAbsent(entries map[string]byte, random *rand.Rand) keySet { - absent := keySet{} - - // set absent for key lengths 0-2, everything not present - if _, ok := entries[""]; !ok { - absent = append(absent, []byte{}) - } - for hi := range 256 { - key := []byte{byte(hi)} - if _, ok := entries[string(key)]; !ok { - absent = append(absent, key) - } - for low := range 256 { - key := []byte{byte(hi), byte(low)} - if _, ok := entries[string(key)]; !ok { - absent = append(absent, key) - } - } - } - - // Add longer keys. - for len(absent) < genAbsentMaxSize { - key := randomFixedLengthKey(8, random) - if _, ok := entries[string(key)]; !ok { - absent = append(absent, key) - } - } - - slices.SortFunc(absent, bytes.Compare) - shuffle(absent, random) - return absent -} - -//nolint:nonamedreturns -func createBounds(keys keySet) (forward, reverse []Bounds) { - for i := range genBoundsMaxSize { - begin := keys[(2*i)%len(keys)] - end := keys[(2*i+1)%len(keys)] - switch cmp := bytes.Compare(begin, end); { - case cmp == 0: - end = append(end, 0) - case cmp > 0: - begin, end = end, begin - case cmp < 0: - // no adjustment needed - } - forward = append(forward, *From(begin).To(end)) - reverse = append(reverse, *From(end).DownTo(begin)) - } - return forward, reverse -} - -//nolint:nonamedreturns -func createFixedBounds(step int, random *rand.Rand) (forward, reverse []Bounds) { - for low := step / 2; low < 1<<24-step; low += step { - high := low + step - keyBytes := binary.BigEndian.AppendUint32(nil, uint32(low)) - lowKey := []byte{keyBytes[1], keyBytes[2], keyBytes[3]} - keyBytes = binary.BigEndian.AppendUint32(nil, uint32(high)) - highKey := []byte{keyBytes[1], keyBytes[2], keyBytes[3]} - forward = append(forward, *From(lowKey).To(highKey)) - reverse = append(reverse, *From(highKey).DownTo(lowKey)) - } - shuffle(forward, random) - shuffle(reverse, random) - return forward, reverse -} - func createBenchStoreConfig(corpusName string, entries map[string]byte) *storeConfig { - random := rand.New(rand.NewPCG(uint64(len(entries)), 4839028453)) ref := newReference() for k, v := range entries { ref.Set([]byte(k), v) } - present := createPresent(entries, random) - absent := createAbsent(entries, random) - keys := make([][]byte, len(present)+len(absent)) - copy(keys, present) - copy(keys[:len(present)], absent) - shuffle(keys, random) - forward, reverse := createBounds(keys) return &storeConfig{ - name: fmt.Sprintf("corpus=%s/size=%d", corpusName, len(entries)), - size: len(entries), - ref: ref, - present: present, - absent: absent, - forward: forward, - reverse: reverse, + name: fmt.Sprintf("corpus=%s/size=%d", corpusName, len(entries)), + size: len(entries), + ref: ref, } } @@ -493,153 +408,137 @@ func BenchmarkDense(b *testing.B) { } } -//nolint:gocognit -func BenchmarkSet(b *testing.B) { +func BenchmarkGet(b *testing.B) { for _, bench := range createTestStores(benchStoreConfigs) { - original := bench.store b.Run(bench.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { - present := bench.config.present - if len(present) == 0 { - b.Skipf("no present keys") - } - store := original.Clone() - i := 0 + next := repeat(slices.Collect(keyIter(bench.config.ref.All())), nil) for b.Loop() { - store.Set(present[i%len(present)], 42) - i++ + bench.store.Get(next()) } }) b.Run("existing=false", func(b *testing.B) { - absent := bench.config.absent - if len(absent) == 0 { - b.Skipf("no absent keys") - } - store := original.Clone() - i := 0 + next := repeat(slices.Collect(absentKeys(bench.config.ref)), nil) for b.Loop() { - if i%len(absent) == 0 && i > 0 { - b.StopTimer() - store = original.Clone() - b.StartTimer() - } - store.Set(absent[i%len(absent)], 42) - i++ + bench.store.Get(next()) } }) }) } } -func BenchmarkGet(b *testing.B) { +func BenchmarkSet(b *testing.B) { for _, bench := range createTestStores(benchStoreConfigs) { b.Run(bench.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { - present := bench.config.present - if len(present) == 0 { - b.Skipf("no present keys") - } - i := 0 + next := repeat(slices.Collect(keyIter(bench.config.ref.All())), nil) for b.Loop() { - bench.store.Get(present[i%len(present)]) - i++ + bench.store.Set(next(), 42) } }) b.Run("existing=false", func(b *testing.B) { - absent := bench.config.absent - if len(absent) == 0 { - b.Skipf("no absent keys") - } - i := 0 + store := bench.store.Clone() + next := repeat(slices.Collect(absentKeys(bench.config.ref)), func() { + b.StopTimer() + store = bench.store.Clone() + b.StartTimer() + }) for b.Loop() { - bench.store.Get(absent[i%len(absent)]) - i++ + store.Set(next(), 42) } }) }) } } -//nolint:gocognit func BenchmarkDelete(b *testing.B) { for _, bench := range createTestStores(benchStoreConfigs) { - original := bench.store b.Run(bench.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { - present := bench.config.present - if len(present) < benchMinNumMutableKeys { - b.Skipf("insufficient present keys: %d", len(present)) - } - store := original.Clone() - i := 0 + store := bench.store.Clone() + next := repeat(slices.Collect(keyIter(bench.config.ref.All())), func() { + b.StopTimer() + store = bench.store.Clone() + b.StartTimer() + }) for b.Loop() { - if i%len(present) == 0 && i > 0 { - b.StopTimer() - store = original.Clone() - b.StartTimer() - } - store.Delete(present[i%len(present)]) - i++ + store.Delete(next()) } }) b.Run("existing=false", func(b *testing.B) { - absent := bench.config.absent - if len(absent) == 0 { - b.Skipf("no absent keys") - } - store := original.Clone() - i := 0 + next := repeat(slices.Collect(absentKeys(bench.config.ref)), nil) for b.Loop() { - store.Delete(absent[i%len(absent)]) - i++ + bench.store.Delete(next()) } }) }) } } +func fixedBounds(step int) keySet { + var keys keySet + for key := step / 2; key < 1<<24-step; key += step { + keyBytes := binary.BigEndian.AppendUint32(nil, uint32(key)) + keys = append(keys, []byte{keyBytes[1], keyBytes[2], keyBytes[3]}) + } + return keys +} + +// Like rangePairs(s), but repeating, and random. +// Assumes s is sorted. +func randomPairs[V any](s []V) func() (V, V) { + n := uint(len(s)) + if n <= 1 { + panic("must have at least 2 elements") + } + random := rand.New(rand.NewPCG(3107354753921, 83741074321)) + return func() (V, V) { + i := random.UintN(n - 1) + j := i + 1 + random.UintN(n-i-1) + return s[i], s[j] + } +} + //nolint:gocognit -func benchRange(b *testing.B, getBounds func(*testStore) ([]Bounds, []Bounds)) { +func benchRange(b *testing.B, getBounds func(*testStore) keySet) { for _, bench := range createTestStores(benchStoreConfigs) { - forward, reverse := getBounds(bench) - original := bench.store - store := original.Clone() + keys := getBounds(bench) b.Run(bench.name, func(b *testing.B) { // This is a hack, but good enough for now. // The words corpus is not uniformly random, unlike the forward/reverse ranges being used. if strings.Contains(bench.name, "corpus=words") { b.Skip() } - b.Run("dir=forward/op=range", func(b *testing.B) { - i := 0 + b.Run("dir=forward/op=init", func(b *testing.B) { + next := randomPairs(keys) for b.Loop() { - store.Range(&forward[i%len(forward)]) - i++ + lowKey, highKey := next() + bench.store.Range(From(lowKey).To(highKey)) } }) b.Run("dir=forward/op=full", func(b *testing.B) { - i := 0 + next := randomPairs(keys) for b.Loop() { - for k, v := range store.Range(&forward[i%len(forward)]) { + lowKey, highKey := next() + for k, v := range bench.store.Range(From(lowKey).To(highKey)) { _, _ = k, v } - i++ } }) - b.Run("dir=reverse/op=range", func(b *testing.B) { - i := 0 + b.Run("dir=reverse/op=init", func(b *testing.B) { + next := randomPairs(keys) for b.Loop() { - store.Range(&reverse[i%len(reverse)]) - i++ + lowKey, highKey := next() + bench.store.Range(From(highKey).DownTo(lowKey)) } }) b.Run("dir=reverse/op=full", func(b *testing.B) { - i := 0 + next := randomPairs(keys) for b.Loop() { - for k, v := range store.Range(&reverse[i%len(reverse)]) { + lowKey, highKey := next() + for k, v := range bench.store.Range(From(highKey).DownTo(lowKey)) { _, _ = k, v } - i++ } }) }) @@ -647,23 +546,21 @@ func benchRange(b *testing.B, getBounds func(*testStore) ([]Bounds, []Bounds)) { } func BenchmarkShortRange(b *testing.B) { - random := rand.New(rand.NewPCG(74320567, 6234982127)) - forward, reverse := createFixedBounds(0x00_00_00_83, random) - benchRange(b, func(_ *testStore) ([]Bounds, []Bounds) { - return forward, reverse + keys := fixedBounds(0x00_00_00_83) + benchRange(b, func(_ *testStore) keySet { + return keys }) } func BenchmarkLongRange(b *testing.B) { - random := rand.New(rand.NewPCG(48239752, 80321318701)) - forward, reverse := createFixedBounds(0x00_02_13_13, random) - benchRange(b, func(_ *testStore) ([]Bounds, []Bounds) { - return forward, reverse + keys := fixedBounds(0x00_02_13_13) + benchRange(b, func(_ *testStore) keySet { + return keys }) } func BenchmarkRandomRange(b *testing.B) { - benchRange(b, func(tt *testStore) ([]Bounds, []Bounds) { - return tt.config.forward, tt.config.reverse + benchRange(b, func(tt *testStore) keySet { + return boundKeys(tt.config.ref) }) } diff --git a/kv_test.go b/kv_test.go index 72ee956..316b73a 100644 --- a/kv_test.go +++ b/kv_test.go @@ -1,9 +1,11 @@ package kv_test import ( + "bytes" "fmt" "iter" "math/bits" + "slices" "strings" "testing" @@ -31,11 +33,6 @@ type ( name string size int ref *reference - - present, absent keySet - - // forward/reverse Bounds instances to test Range. - forward, reverse []Bounds } // A store created by a def.factory(), possibly with entries from config. @@ -78,53 +75,6 @@ var ( {0xC5, 0x43}, } - // Non-empty keys very near presentTestKeys, but not in presentTestKeys. - testAbsentKeys = keySet{ - {0, 0}, - {0x22, 0xFF}, - {0x23, 0, 0}, - {0x23, 0xA4, 0xFF}, - {0x23, 0xA5, 0}, - {0x23, 0xA5, 0xFF}, - {0x23, 0xA6, 0}, - {0xC4, 0xFF}, - {0xC5, 0, 0}, - {0xC5, 0x41, 0xFF}, - {0xC5, 0x42, 0}, - {0xC5, 0x42, 0xFF}, - {0xC5, 0x43, 0}, - } - - // presentTestKeys + absentTestKeys + +/-Inf. - // Except for the nils, these are in lexicographical order. - testNearKeys = keySet{ - nil, // -Inf - {}, - {0}, - {0, 0}, - {0x22, 0xFF}, - {0x23}, - {0x23, 0}, - {0x23, 0, 0}, - {0x23, 0xA4, 0xFF}, - {0x23, 0xA5}, - {0x23, 0xA5, 0}, - {0x23, 0xA5, 0xFF}, - {0x23, 0xA6}, - {0x23, 0xA6, 0}, - {0xC4, 0xFF}, - {0xC5}, - {0xC5, 0}, - {0xC5, 0, 0}, - {0xC5, 0x41, 0xFF}, - {0xC5, 0x42}, - {0xC5, 0x42, 0}, - {0xC5, 0x42, 0xFF}, - {0xC5, 0x43}, - {0xC5, 0x43, 0}, - nil, // +Inf - } - testStoreConfigs = createTestStoreConfigs() ) @@ -217,41 +167,159 @@ func asCloneable(factory func() kv.Store[byte]) func() TestStore { } } -// storeConfigs for all possible subsequences of presentKeys. -func createTestStoreConfigs() []*storeConfig { - result := []*storeConfig{} +// Returns an iterator over the keys of itr. +func keyIter[K, V any](itr iter.Seq2[K, V]) iter.Seq[K] { + return func(yield func(K) bool) { + for k := range itr { + if !yield(k) { + return + } + } + } +} + +// Assumes a < b. Returns a copy of a if no distinct midpoint is possible. +func midPoint(a, b []byte) []byte { + mid := make([]byte, len(a)) + copy(mid, a) + for i := range a { + if i >= len(b) { + // not possible, because a > b if true + panic("something is very, very wrong") + } + if a[i] == b[i] { + continue + } + if a[i]+1 == b[i] { + // Keep mid[i] = a[i], guaranteeing mid < b. Increase the remaining bytes. + for j := i + 1; j < len(a); j++ { + mid[j] += (0xFF - a[j]) / 2 + } + // Handles the case when the remaining bytes were all 0xFE or 0xFF. + return append(mid, 0x00) + } + // a[i] and b[i] differ by at least 2 + mid[i] += (b[i] - a[i]) / 2 + return mid + } + // If we reach here, a is a prefix of b. + for _, byt := range b[len(a):] { + mid = append(mid, byt/2) + } + // This happens if b is a followed by only zeroes. Truncate mid a bit. + if bytes.Equal(mid, b) { + return mid[:(len(a)+len(b))/2] + } + return mid +} + +// Returns an ascending sequence of keys not in the given store. +// The logic is roughly: +// +// yield empty key +// for key in store.Asc(nil, nil) { +// yield midPoint between the last yielded key and key +// yield prevKey(key) +// yield nextKey(key) +// } +// yield midPoint between the largest key and {FF, FF, ...} +// yield {FF, FF, ...} +// +//nolint:gocognit +func absentKeys[V any](store kv.Store[V]) iter.Seq[[]byte] { + return func(yield func([]byte) bool) { + // The previously yielded key. + lastYield := []byte{} + if _, ok := store.Get(lastYield); !ok { + if !yield(lastYield) { + return + } + } + for k := range store.Range(forwardAll) { + // Compute the midpoint between lastYield and k, for some definition of "midpoint". + // Note that lastYield < k, unless k is empty, because... + // (the code below assumes this is true) + // + // If no keys have been yielded yet, this is trivially true (lastYield is empty). + // So assume a key has been yielded, + // although lastYield could still be empty if store.Asc starts with {[0], [0, 0], ...}). + // There is no key X such that K < X < next(K) for any key K (follows from nextKey's implementation). + // + // Let K0 be the previously returned key from the store.Asc iterator, and K1 the current key. K0 < K1. + // K0 exists, because some key has been yielded. + // lastYield <= nextKey(K0), because that's the largest of the 3 possible keys (mid, prev, next). + // K0 < nextKey(K0) <= K1, because there are no keys between K0 and nextKey(K0). + // So we have lastYield <= nextKey(K0) <= K1, and we're trying to show lastYield < K1. + // Equivalently, we're trying to show lastYield != K1. + // But lastYield can't be K1, since no keys present in store are ever yielded. + keys := [][]byte{nextKey(k)} + if len(k) > 0 { + keys = append(keys, midPoint(lastYield, k), prevKey(k)) + } + slices.SortFunc(keys, bytes.Compare) + for _, key := range keys { + if bytes.Compare(key, lastYield) <= 0 { + continue + } + if _, ok := store.Get(key); ok { + continue + } + if !yield(key) { + return + } + lastYield = key + } + } + final := bytes.Repeat([]byte{0xFF}, len(lastYield)+1) + if !yield(midPoint(lastYield, final)) { + return + } + yield(final) + } +} + +// Returns present + absent + +/-Inf, sorted. +func boundKeys[V any](store kv.Store[V]) [][]byte { + keys := slices.Collect(keyIter(store.Range(forwardAll))) + keys = slices.AppendSeq(keys, absentKeys(store)) + slices.SortFunc(keys, bytes.Compare) + keys = slices.CompactFunc(keys, bytes.Equal) + nilKey := []byte(nil) + keys = append([][]byte{nilKey}, keys...) + keys = append(keys, nilKey) + return keys +} - // Every storeConfig here gets the same set of test Bounds. - var forward, reverse []Bounds - for i, low := range testNearKeys { - for _, high := range testNearKeys[i+1:] { - forward = append(forward, *From(low).To(high)) - reverse = append(reverse, *From(high).DownTo(low)) +// keys must be sorted. +func rangePairs(keys [][]byte) iter.Seq2[[]byte, []byte] { + return func(yield func([]byte, []byte) bool) { + for i, low := range keys { + for _, high := range keys[i+1:] { + if !yield(low, high) { + return + } + } } } +} +// storeConfigs for all possible subsequences of presentKeys. +func createTestStoreConfigs() []*storeConfig { + result := []*storeConfig{} // Every bit pattern of i defines which keys are present in that config. for keyBits := range 1 << len(testPresentKeys) { config := storeConfig{ fmt.Sprintf("sub-store=%0*b", len(testPresentKeys), keyBits), bits.OnesCount(uint(keyBits)), newReference(), - keySet{}, - keySet{}, - forward, - reverse, } mask := 0x01 for i, k := range testPresentKeys { if keyBits&mask != 0 { config.ref.Set(k, byte(i)) - config.present = append(config.present, k) - } else { - config.absent = append(config.absent, k) } mask <<= 1 } - config.absent = append(config.absent, testAbsentKeys...) result = append(result, &config) } return result @@ -533,18 +601,19 @@ func TestStores(t *testing.T) { }) } - for _, k := range test.config.absent { + for k := range absentKeys(test.config.ref) { t.Run("op=absent/key="+kv.KeyName(k), func(t *testing.T) { assertAbsent(t, k, store) }) } t.Run("op=range", func(t *testing.T) { - for _, bounds := range test.config.forward { - assertItersEqual(t, test.config.ref.Range(&bounds), store.Range(&bounds), "%s", &bounds) - } - for _, bounds := range test.config.reverse { - assertItersEqual(t, test.config.ref.Range(&bounds), store.Range(&bounds), "%s", &bounds) + keyPairs := boundKeys(test.config.ref) + for low, high := range rangePairs(keyPairs) { + forward := From(low).To(high) + reverse := From(high).DownTo(low) + assertItersEqual(t, test.config.ref.Range(forward), store.Range(forward), "%s", forward) + assertItersEqual(t, test.config.ref.Range(reverse), store.Range(reverse), "%s", reverse) } assertEarlyYield(t, test.config.size, store.Range(forwardAll)) assertEarlyYield(t, test.config.size, store.Range(reverseAll)) @@ -570,7 +639,8 @@ func TestClone(t *testing.T) { store.Delete(k) } assertIterEmpty(t, store.Range(forwardAll)) - for i, k := range test.config.absent { + i := 0 + for k := range absentKeys(test.config.ref) { store.Set(k, byte(i)) } assertSame(t, test.config.ref, original) @@ -581,8 +651,10 @@ func TestClone(t *testing.T) { original.Delete(k) } assertIterEmpty(t, original.Range(forwardAll)) - for i, k := range test.config.absent { + i = 0 + for k := range absentKeys(test.config.ref) { original.Set(k, byte(i)) + i++ } assertSame(t, test.config.ref, store) }) From e6a864ba277ecfebd4efc1b29a6806ac3899d2dd Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:32:38 -0700 Subject: [PATCH 02/30] Test asc/desc separately. --- bench_test.go | 56 +++++++++++++-------------------------------------- 1 file changed, 14 insertions(+), 42 deletions(-) diff --git a/bench_test.go b/bench_test.go index d192ef4..4f2c36e 100644 --- a/bench_test.go +++ b/bench_test.go @@ -8,7 +8,6 @@ import ( rand "math/rand/v2" "os" "slices" - "strings" "testing" "github.com/phiryll/kv" @@ -475,15 +474,6 @@ func BenchmarkDelete(b *testing.B) { } } -func fixedBounds(step int) keySet { - var keys keySet - for key := step / 2; key < 1<<24-step; key += step { - keyBytes := binary.BigEndian.AppendUint32(nil, uint32(key)) - keys = append(keys, []byte{keyBytes[1], keyBytes[2], keyBytes[3]}) - } - return keys -} - // Like rangePairs(s), but repeating, and random. // Assumes s is sorted. func randomPairs[V any](s []V) func() (V, V) { @@ -499,24 +489,18 @@ func randomPairs[V any](s []V) func() (V, V) { } } -//nolint:gocognit -func benchRange(b *testing.B, getBounds func(*testStore) keySet) { +func BenchmarkAsc(b *testing.B) { for _, bench := range createTestStores(benchStoreConfigs) { - keys := getBounds(bench) b.Run(bench.name, func(b *testing.B) { - // This is a hack, but good enough for now. - // The words corpus is not uniformly random, unlike the forward/reverse ranges being used. - if strings.Contains(bench.name, "corpus=words") { - b.Skip() - } - b.Run("dir=forward/op=init", func(b *testing.B) { + keys := boundKeys(bench.config.ref) + b.Run("op=init", func(b *testing.B) { next := randomPairs(keys) for b.Loop() { lowKey, highKey := next() bench.store.Range(From(lowKey).To(highKey)) } }) - b.Run("dir=forward/op=full", func(b *testing.B) { + b.Run("op=full", func(b *testing.B) { next := randomPairs(keys) for b.Loop() { lowKey, highKey := next() @@ -525,14 +509,22 @@ func benchRange(b *testing.B, getBounds func(*testStore) keySet) { } } }) - b.Run("dir=reverse/op=init", func(b *testing.B) { + }) + } +} + +func BenchmarkDesc(b *testing.B) { + for _, bench := range createTestStores(benchStoreConfigs) { + b.Run(bench.name, func(b *testing.B) { + keys := boundKeys(bench.config.ref) + b.Run("op=init", func(b *testing.B) { next := randomPairs(keys) for b.Loop() { lowKey, highKey := next() bench.store.Range(From(highKey).DownTo(lowKey)) } }) - b.Run("dir=reverse/op=full", func(b *testing.B) { + b.Run("op=full", func(b *testing.B) { next := randomPairs(keys) for b.Loop() { lowKey, highKey := next() @@ -544,23 +536,3 @@ func benchRange(b *testing.B, getBounds func(*testStore) keySet) { }) } } - -func BenchmarkShortRange(b *testing.B) { - keys := fixedBounds(0x00_00_00_83) - benchRange(b, func(_ *testStore) keySet { - return keys - }) -} - -func BenchmarkLongRange(b *testing.B) { - keys := fixedBounds(0x00_02_13_13) - benchRange(b, func(_ *testStore) keySet { - return keys - }) -} - -func BenchmarkRandomRange(b *testing.B) { - benchRange(b, func(tt *testStore) keySet { - return boundKeys(tt.config.ref) - }) -} From 23149fbb40917d18d3c35ba28292b031bd1bbbef Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Thu, 10 Jul 2025 14:05:01 -0700 Subject: [PATCH 03/30] Add benchmark for All, which currently delegates to Range. --- bench_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/bench_test.go b/bench_test.go index 4f2c36e..44eca0b 100644 --- a/bench_test.go +++ b/bench_test.go @@ -489,6 +489,25 @@ func randomPairs[V any](s []V) func() (V, V) { } } +func BenchmarkAll(b *testing.B) { + for _, bench := range createTestStores(benchStoreConfigs) { + b.Run(bench.name, func(b *testing.B) { + b.Run("op=init", func(b *testing.B) { + for b.Loop() { + bench.store.Range(forwardAll) + } + }) + b.Run("op=full", func(b *testing.B) { + for b.Loop() { + for k, v := range bench.store.Range(forwardAll) { + _, _ = k, v + } + } + }) + }) + } +} + func BenchmarkAsc(b *testing.B) { for _, bench := range createTestStores(benchStoreConfigs) { b.Run(bench.name, func(b *testing.B) { From c4c08a79006f187eab10e81f943d75567f1fa85a Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Thu, 10 Jul 2025 14:41:47 -0700 Subject: [PATCH 04/30] Fix rangePairs to be evenly distributed. Not all lower bounds are equally likely, so choosing that uniformly over the entire set is incorrect. --- bench_test.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/bench_test.go b/bench_test.go index 44eca0b..60e4518 100644 --- a/bench_test.go +++ b/bench_test.go @@ -483,8 +483,13 @@ func randomPairs[V any](s []V) func() (V, V) { } random := rand.New(rand.NewPCG(3107354753921, 83741074321)) return func() (V, V) { - i := random.UintN(n - 1) - j := i + 1 + random.UintN(n-i-1) + var i, j uint + for i == j { + i, j = random.UintN(n), random.UintN(n) + } + if i > j { + i, j = j, i + } return s[i], s[j] } } From e3d738d730f317619e19ca804236d2dede563663 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Thu, 10 Jul 2025 14:54:59 -0700 Subject: [PATCH 05/30] Benchmark both dirty and not-dirty ranges. --- bench_test.go | 28 ++++++++++++++++++++++++++++ reference_test.go | 11 +++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/bench_test.go b/bench_test.go index 60e4518..0e7eb96 100644 --- a/bench_test.go +++ b/bench_test.go @@ -533,6 +533,20 @@ func BenchmarkAsc(b *testing.B) { } } }) + b.Run("op=full-dirty", func(b *testing.B) { + ref, ok := bench.store.(*reference) + if !ok { + b.Skipf("skipping store of type %T", bench.store) + } + next := randomPairs(keys) + for b.Loop() { + lowKey, highKey := next() + ref.makeDirty() + for k, v := range ref.Range(From(lowKey).To(highKey)) { + _, _ = k, v + } + } + }) }) } } @@ -557,6 +571,20 @@ func BenchmarkDesc(b *testing.B) { } } }) + b.Run("op=full-dirty", func(b *testing.B) { + ref, ok := bench.store.(*reference) + if !ok { + b.Skipf("skipping store of type %T", bench.store) + } + next := randomPairs(keys) + for b.Loop() { + lowKey, highKey := next() + ref.makeDirty() + for k, v := range ref.Range(From(highKey).DownTo(lowKey)) { + _, _ = k, v + } + } + }) }) } } diff --git a/reference_test.go b/reference_test.go index 0ead9de..a079a97 100644 --- a/reference_test.go +++ b/reference_test.go @@ -34,6 +34,11 @@ func (r *reference) Clone() TestStore { } } +func (r *reference) makeDirty() { + r.ascKeys = nil + r.dirty = true +} + func (r *reference) refresh() { if !r.dirty { return @@ -61,8 +66,7 @@ func (r *reference) Set(key []byte, value byte) (byte, bool) { } prev, ok := r.entries[string(key)] r.entries[string(key)] = value - r.ascKeys = nil - r.dirty = true + r.makeDirty() return prev, ok } @@ -73,8 +77,7 @@ func (r *reference) Delete(key []byte) (byte, bool) { value, ok := r.entries[string(key)] if ok { delete(r.entries, string(key)) - r.ascKeys = nil - r.dirty = true + r.makeDirty() } return value, ok } From e0ddbe681d03cf3306c6db419d09e68a88ad485a Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:05:55 -0700 Subject: [PATCH 06/30] Create storeConfigs for unit tests on the fly. --- kv_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/kv_test.go b/kv_test.go index 316b73a..e55dd91 100644 --- a/kv_test.go +++ b/kv_test.go @@ -74,8 +74,6 @@ var ( {0xC5, 0x42}, {0xC5, 0x43}, } - - testStoreConfigs = createTestStoreConfigs() ) // nextKey and prevKey may get promoted to exported functions if there's a good use case. @@ -581,7 +579,7 @@ func assertEarlyYield(t *testing.T, size int, itr iter.Seq2[[]byte, byte]) { func TestStores(t *testing.T) { t.Parallel() - for _, test := range createTestStores(testStoreConfigs) { + for _, test := range createTestStores(createTestStoreConfigs()) { t.Run(test.name, func(t *testing.T) { t.Parallel() @@ -624,7 +622,7 @@ func TestStores(t *testing.T) { func TestClone(t *testing.T) { t.Parallel() - for _, test := range createTestStores(testStoreConfigs) { + for _, test := range createTestStores(createTestStoreConfigs()) { t.Run(test.name, func(t *testing.T) { t.Parallel() original := test.store From cd91156f921fa882a7f45a0d55978b3f02b096bd Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:14:46 -0700 Subject: [PATCH 07/30] Rename TestStore to ByteStore. This reduces confusion with the testStore type. --- fuzz_test.go | 6 +++--- kv_test.go | 24 ++++++++++++------------ reference_test.go | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/fuzz_test.go b/fuzz_test.go index 85826f2..7f26511 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -81,7 +81,7 @@ func FuzzGet(f *testing.F) { func FuzzSet(f *testing.F) { fuzzStores := createTestStores(fuzzStoreConfigs) // This only works because there is only one fuzz store config. - // This is unfortunately necessary because configs are shared between TestStores. + // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. ref := fuzzStoreConfigs[0].ref.Clone() f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen, value byte) { @@ -101,7 +101,7 @@ func FuzzSet(f *testing.F) { func FuzzDelete(f *testing.F) { fuzzStores := createTestStores(fuzzStoreConfigs) // This only works because there is only one fuzz store config. - // This is unfortunately necessary because configs are shared between TestStores. + // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. ref := fuzzStoreConfigs[0].ref.Clone() f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen byte) { @@ -143,7 +143,7 @@ func FuzzRange(f *testing.F) { func FuzzMixed(f *testing.F) { fuzzStores := createTestStores(fuzzStoreConfigs) // This only works because there is only one fuzz store config. - // This is unfortunately necessary because configs are shared between TestStores. + // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. ref := fuzzStoreConfigs[0].ref.Clone() f.Fuzz(func(t *testing.T, fuzzSetKey, fuzzDeleteKey uint32, fuzzSetKeyLen, fuzzDeleteKeyLen, value byte) { diff --git a/kv_test.go b/kv_test.go index e55dd91..1ec769e 100644 --- a/kv_test.go +++ b/kv_test.go @@ -15,13 +15,13 @@ import ( ) type ( - TestStore = kv.Cloneable[byte] + ByteStore = kv.Cloneable[byte] Bounds = kv.Bounds keySet = [][]byte // instances will generally have unique keys implDef struct { name string - factory func() TestStore + factory func() ByteStore } // A description of a store to be tested or benchmarked. @@ -39,7 +39,7 @@ type ( // For some tests, an empty store might be created and config might be nil. testStore struct { name string - store TestStore + store ByteStore def *implDef config *storeConfig } @@ -51,7 +51,7 @@ const ( var ( implDefs = []*implDef{ - {"impl=reference", func() TestStore { return TestStore(newReference()) }}, + {"impl=reference", func() ByteStore { return ByteStore(newReference()) }}, {"impl=pointer-trie", asCloneable(kv.NewPointerTrie[byte])}, {"impl=array-trie", asCloneable(kv.NewArrayTrie[byte])}, } @@ -154,10 +154,10 @@ func TestPrevKey(t *testing.T) { } } -func asCloneable(factory func() kv.Store[byte]) func() TestStore { - return func() TestStore { +func asCloneable(factory func() kv.Store[byte]) func() ByteStore { + return func() ByteStore { store := factory() - cloneable, ok := store.(TestStore) + cloneable, ok := store.(ByteStore) if !ok { panic(fmt.Sprintf("%T is not Cloneable", store)) } @@ -339,7 +339,7 @@ func createTestStores(storeConfigs []*storeConfig) []*testStore { } /* -func assertPresent(t *testing.T, key []byte, value byte, store TestStore) { +func assertPresent(t *testing.T, key []byte, value byte, store ByteStore) { actual, ok := store.Get(key) assert.True(t, ok) assert.Equal(t, value, actual) @@ -358,7 +358,7 @@ func assertPresent(t *testing.T, key []byte, value byte, store TestStore) { } */ -func assertAbsent(t *testing.T, key []byte, store TestStore) { +func assertAbsent(t *testing.T, key []byte, store ByteStore) { actual, ok := store.Get(key) assert.False(t, ok) assert.Equal(t, zero, actual) @@ -375,7 +375,7 @@ func assertAbsent(t *testing.T, key []byte, store TestStore) { // Test that store contains only the key/value pairs in entries, // and that Range(forward/reverse) returns them in the correct order. -func assertSame(t *testing.T, expected *reference, actual TestStore) { +func assertSame(t *testing.T, expected *reference, actual ByteStore) { for k, v := range expected.All() { actual, ok := actual.Get(k) assert.True(t, ok) @@ -410,7 +410,7 @@ func TestNilArgPanics(t *testing.T) { // Tests Get/Set/Delete/Range with a specific key and store, which should not contain key. // The store should be the same after invoking this function. // Assumes store.Range(forwardAll) works. -func testKey(t *testing.T, key []byte, store TestStore) { +func testKey(t *testing.T, key []byte, store ByteStore) { const value = byte(43) const replacement = byte(57) ref := newReference() @@ -460,7 +460,7 @@ func TestEmptyKey(t *testing.T) { } // If String() exists, make sure it doesn't crash. -func TestStoreString(t *testing.T) { +func TestString(t *testing.T) { t.Parallel() for _, def := range implDefs { t.Run(def.name, func(t *testing.T) { diff --git a/reference_test.go b/reference_test.go index a079a97..a6e3d7a 100644 --- a/reference_test.go +++ b/reference_test.go @@ -26,7 +26,7 @@ func newReference() *reference { } } -func (r *reference) Clone() TestStore { +func (r *reference) Clone() ByteStore { return &reference{ maps.Clone(r.entries), slices.Clone(r.ascKeys), From 2334a877096f5a9d7e3ea07063feac3562027f4d Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:20:33 -0700 Subject: [PATCH 08/30] Don't need store size to test early yield. --- kv_test.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/kv_test.go b/kv_test.go index 1ec769e..15ec0f7 100644 --- a/kv_test.go +++ b/kv_test.go @@ -561,20 +561,17 @@ func assertItersEqual[K, V any](t *testing.T, expected, actual iter.Seq2[K, V], // This tests that an early yield does not fail, // and ensures those code paths get test coverage. -func assertEarlyYield(t *testing.T, size int, itr iter.Seq2[[]byte, byte]) { +func assertEarlyYield(t *testing.T, itr iter.Seq2[[]byte, byte]) { + const maxCount = 4 t.Helper() - expectedCount := size - if expectedCount > 4 { - expectedCount = 4 - } count := 0 for range itr { - if count > 3 { + if count >= maxCount { break } count++ } - assert.Equal(t, expectedCount, count) + assert.LessOrEqual(t, count, maxCount) } func TestStores(t *testing.T) { @@ -613,8 +610,8 @@ func TestStores(t *testing.T) { assertItersEqual(t, test.config.ref.Range(forward), store.Range(forward), "%s", forward) assertItersEqual(t, test.config.ref.Range(reverse), store.Range(reverse), "%s", reverse) } - assertEarlyYield(t, test.config.size, store.Range(forwardAll)) - assertEarlyYield(t, test.config.size, store.Range(reverseAll)) + assertEarlyYield(t, store.Range(forwardAll)) + assertEarlyYield(t, store.Range(reverseAll)) }) }) } From cf5b56c0cc5e0319b835641b52ad36f545fa129f Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:24:17 -0700 Subject: [PATCH 09/30] Remove unnecessary temporary variable. --- kv_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kv_test.go b/kv_test.go index 15ec0f7..d3f8ded 100644 --- a/kv_test.go +++ b/kv_test.go @@ -603,8 +603,7 @@ func TestStores(t *testing.T) { } t.Run("op=range", func(t *testing.T) { - keyPairs := boundKeys(test.config.ref) - for low, high := range rangePairs(keyPairs) { + for low, high := range rangePairs(boundKeys(test.config.ref)) { forward := From(low).To(high) reverse := From(high).DownTo(low) assertItersEqual(t, test.config.ref.Range(forward), store.Range(forward), "%s", forward) From f6d90b74f89280be08bde8a598653021b0b9afc5 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Thu, 10 Jul 2025 16:32:32 -0700 Subject: [PATCH 10/30] Lazily produce subsequences for all-subsets tests. --- kv_test.go | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/kv_test.go b/kv_test.go index d3f8ded..1ecfc7b 100644 --- a/kv_test.go +++ b/kv_test.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "iter" - "math/bits" "slices" "strings" "testing" @@ -301,24 +300,43 @@ func rangePairs(keys [][]byte) iter.Seq2[[]byte, []byte] { } } +func subsequences(n int) iter.Seq2[string, iter.Seq[int]] { + // Limiting this because 32 would result in 2^32 subsequences. + if n >= 32 { + panic(fmt.Sprintf("%d is too large", n)) + } + return func(yieldSubSeq func(string, iter.Seq[int]) bool) { + // keyBits loops through bit pattern, aka keyBits, for n bits. + // Each 1 bit corresponds to an element of this subsequence. + for keyBits := range 1 << n { + name := fmt.Sprintf("%0*b", n, keyBits) + subSeq := func(yieldValue func(int) bool) { + mask := 0x01 + for i := range n { + if keyBits&mask != 0 && !yieldValue(i) { + return + } + mask <<= 1 + } + } + if !yieldSubSeq(name, subSeq) { + return + } + } + } +} + // storeConfigs for all possible subsequences of presentKeys. func createTestStoreConfigs() []*storeConfig { result := []*storeConfig{} - // Every bit pattern of i defines which keys are present in that config. - for keyBits := range 1 << len(testPresentKeys) { - config := storeConfig{ - fmt.Sprintf("sub-store=%0*b", len(testPresentKeys), keyBits), - bits.OnesCount(uint(keyBits)), - newReference(), - } - mask := 0x01 - for i, k := range testPresentKeys { - if keyBits&mask != 0 { - config.ref.Set(k, byte(i)) - } - mask <<= 1 + for name, indexIter := range subsequences(len(testPresentKeys)) { + ref := newReference() + size := 0 + for i := range indexIter { + ref.Set(testPresentKeys[i], byte(i)) + size++ } - result = append(result, &config) + result = append(result, &storeConfig{"sub-store=" + name, size, ref}) } return result } From aab5a71195fc80e4c96e0c83618cdf7678388d25 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Thu, 10 Jul 2025 16:52:18 -0700 Subject: [PATCH 11/30] Create test configs and test stores on the fly. Some situations, benchmarking in particular, benefit from calculating these once. For those, use slices.Collect to cache the results. --- bench_test.go | 16 ++++++++-------- fuzz_test.go | 11 ++++++----- kv_test.go | 47 +++++++++++++++++++++++++---------------------- 3 files changed, 39 insertions(+), 35 deletions(-) diff --git a/bench_test.go b/bench_test.go index 0e7eb96..08f728c 100644 --- a/bench_test.go +++ b/bench_test.go @@ -316,7 +316,7 @@ func BenchmarkFactory(b *testing.B) { } func BenchmarkCreate(b *testing.B) { - for _, bench := range createTestStores(benchStoreConfigs) { + for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { for b.Loop() { store := bench.def.factory() @@ -332,7 +332,7 @@ func BenchmarkCreate(b *testing.B) { // If it is, that's a sign it's sharing storage instead of creating new storage. // This also helps to understand how Clone() can impact other benchmarks which use it. func BenchmarkClone(b *testing.B) { - for _, bench := range createTestStores(benchStoreConfigs) { + for bench := range createTestStores(slices.Values(benchStoreConfigs)) { original := bench.store b.Run(bench.name, func(b *testing.B) { for b.Loop() { @@ -408,7 +408,7 @@ func BenchmarkDense(b *testing.B) { } func BenchmarkGet(b *testing.B) { - for _, bench := range createTestStores(benchStoreConfigs) { + for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(bench.config.ref.All())), nil) @@ -427,7 +427,7 @@ func BenchmarkGet(b *testing.B) { } func BenchmarkSet(b *testing.B) { - for _, bench := range createTestStores(benchStoreConfigs) { + for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(bench.config.ref.All())), nil) @@ -451,7 +451,7 @@ func BenchmarkSet(b *testing.B) { } func BenchmarkDelete(b *testing.B) { - for _, bench := range createTestStores(benchStoreConfigs) { + for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { store := bench.store.Clone() @@ -495,7 +495,7 @@ func randomPairs[V any](s []V) func() (V, V) { } func BenchmarkAll(b *testing.B) { - for _, bench := range createTestStores(benchStoreConfigs) { + for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { b.Run("op=init", func(b *testing.B) { for b.Loop() { @@ -514,7 +514,7 @@ func BenchmarkAll(b *testing.B) { } func BenchmarkAsc(b *testing.B) { - for _, bench := range createTestStores(benchStoreConfigs) { + for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { keys := boundKeys(bench.config.ref) b.Run("op=init", func(b *testing.B) { @@ -552,7 +552,7 @@ func BenchmarkAsc(b *testing.B) { } func BenchmarkDesc(b *testing.B) { - for _, bench := range createTestStores(benchStoreConfigs) { + for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { keys := boundKeys(bench.config.ref) b.Run("op=init", func(b *testing.B) { diff --git a/fuzz_test.go b/fuzz_test.go index 7f26511..1b46dbc 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/binary" rand "math/rand/v2" + "slices" "testing" "github.com/phiryll/kv" @@ -66,7 +67,7 @@ func createFuzzStoreConfigs(size int) []*storeConfig { } func FuzzGet(f *testing.F) { - fuzzStores := createTestStores(fuzzStoreConfigs) + fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzStoreConfigs))) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) for _, fuzz := range fuzzStores { @@ -79,7 +80,7 @@ func FuzzGet(f *testing.F) { } func FuzzSet(f *testing.F) { - fuzzStores := createTestStores(fuzzStoreConfigs) + fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzStoreConfigs))) // This only works because there is only one fuzz store config. // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. @@ -99,7 +100,7 @@ func FuzzSet(f *testing.F) { } func FuzzDelete(f *testing.F) { - fuzzStores := createTestStores(fuzzStoreConfigs) + fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzStoreConfigs))) // This only works because there is only one fuzz store config. // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. @@ -119,7 +120,7 @@ func FuzzDelete(f *testing.F) { } func FuzzRange(f *testing.F) { - fuzzStores := createTestStores(fuzzRangeStoreConfigs) + fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzRangeStoreConfigs))) f.Fuzz(func(t *testing.T, fuzzBeginKey, fuzzEndKey uint32, fuzzBeginKeyLen, fuzzEndKeyLen byte) { begin := keyForFuzzInputs(fuzzBeginKey, fuzzBeginKeyLen) end := keyForFuzzInputs(fuzzEndKey, fuzzEndKeyLen) @@ -141,7 +142,7 @@ func FuzzRange(f *testing.F) { } func FuzzMixed(f *testing.F) { - fuzzStores := createTestStores(fuzzStoreConfigs) + fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzStoreConfigs))) // This only works because there is only one fuzz store config. // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. diff --git a/kv_test.go b/kv_test.go index 1ecfc7b..5367130 100644 --- a/kv_test.go +++ b/kv_test.go @@ -327,33 +327,36 @@ func subsequences(n int) iter.Seq2[string, iter.Seq[int]] { } // storeConfigs for all possible subsequences of presentKeys. -func createTestStoreConfigs() []*storeConfig { - result := []*storeConfig{} - for name, indexIter := range subsequences(len(testPresentKeys)) { - ref := newReference() - size := 0 - for i := range indexIter { - ref.Set(testPresentKeys[i], byte(i)) - size++ +func createTestStoreConfigs() iter.Seq[*storeConfig] { + return func(yield func(*storeConfig) bool) { + for name, indexIter := range subsequences(len(testPresentKeys)) { + ref := newReference() + size := 0 + for i := range indexIter { + ref.Set(testPresentKeys[i], byte(i)) + size++ + } + if !yield(&storeConfig{"sub-store=" + name, size, ref}) { + return + } } - result = append(result, &storeConfig{"sub-store=" + name, size, ref}) } - return result } -func createTestStores(storeConfigs []*storeConfig) []*testStore { - result := []*testStore{} - for _, config := range storeConfigs { - for _, def := range implDefs { - store := def.factory() - for k, v := range config.ref.All() { - store.Set(k, v) +func createTestStores(storeConfigs iter.Seq[*storeConfig]) iter.Seq[*testStore] { + return func(yield func(*testStore) bool) { + for config := range storeConfigs { + for _, def := range implDefs { + store := def.factory() + for k, v := range config.ref.All() { + store.Set(k, v) + } + if !yield(&testStore{config.name + "/" + def.name, store, def, config}) { + return + } } - name := config.name + "/" + def.name - result = append(result, &testStore{name, store, def, config}) } } - return result } /* @@ -594,7 +597,7 @@ func assertEarlyYield(t *testing.T, itr iter.Seq2[[]byte, byte]) { func TestStores(t *testing.T) { t.Parallel() - for _, test := range createTestStores(createTestStoreConfigs()) { + for test := range createTestStores(createTestStoreConfigs()) { t.Run(test.name, func(t *testing.T) { t.Parallel() @@ -636,7 +639,7 @@ func TestStores(t *testing.T) { func TestClone(t *testing.T) { t.Parallel() - for _, test := range createTestStores(createTestStoreConfigs()) { + for test := range createTestStores(createTestStoreConfigs()) { t.Run(test.name, func(t *testing.T) { t.Parallel() original := test.store From 9a3bcba9b661bdeab7aa26d07dec39d33bffd990 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:03:10 -0700 Subject: [PATCH 12/30] Remove unnecessary index check. The Go runtime will panic on the following line anyway. --- kv_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/kv_test.go b/kv_test.go index 5367130..d1d58e7 100644 --- a/kv_test.go +++ b/kv_test.go @@ -180,10 +180,6 @@ func midPoint(a, b []byte) []byte { mid := make([]byte, len(a)) copy(mid, a) for i := range a { - if i >= len(b) { - // not possible, because a > b if true - panic("something is very, very wrong") - } if a[i] == b[i] { continue } From a4f50e6b90a8d8224515342aab4e37c57dec3ece Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:36:03 -0700 Subject: [PATCH 13/30] Move Desc arg handling to Range. --- reference_test.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/reference_test.go b/reference_test.go index a6e3d7a..fb94bbe 100644 --- a/reference_test.go +++ b/reference_test.go @@ -85,13 +85,20 @@ func (r *reference) Delete(key []byte) (byte, bool) { func (r *reference) Range(bounds *Bounds) iter.Seq2[[]byte, byte] { bounds = bounds.Clone() if bounds.IsReverse { - return r.Desc(bounds.End, bounds.Begin) + // Desc behaves differently than Range, with low inclusive and high exclusive. + low, high := bounds.End, bounds.Begin + if low != nil { + low = nextKey(low) + } + if high != nil { + high = nextKey(high) + } + return r.Desc(low, high) } return r.Asc(bounds.Begin, bounds.End) } // Future methods on Store, replacing Range. -// Desc will behave differently, with low inclusive and high exclusive. func (r *reference) All() iter.Seq2[[]byte, byte] { return func(yield func([]byte, byte) bool) { @@ -134,14 +141,7 @@ func (r *reference) Desc(low, high []byte) iter.Seq2[[]byte, byte] { } return func(yield func([]byte, byte) bool) { r.refresh() - a, b := low, high - if a != nil { - a = nextKey(a) - } - if b != nil { - b = nextKey(b) - } - for _, key := range slices.Backward(r.between(a, b)) { + for _, key := range slices.Backward(r.between(low, high)) { if !yield(key, r.entries[string(key)]) { return } From 8fa01c6f2084b6e103e9b3ad981d1605186b0543 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:49:00 -0700 Subject: [PATCH 14/30] Refactor BenchmarkAsc/Desc to pull out common code. --- bench_test.go | 54 ++++++++++++--------------------------------------- 1 file changed, 12 insertions(+), 42 deletions(-) diff --git a/bench_test.go b/bench_test.go index 08f728c..0c1ab22 100644 --- a/bench_test.go +++ b/bench_test.go @@ -513,22 +513,22 @@ func BenchmarkAll(b *testing.B) { } } -func BenchmarkAsc(b *testing.B) { +func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { keys := boundKeys(bench.config.ref) b.Run("op=init", func(b *testing.B) { next := randomPairs(keys) for b.Loop() { - lowKey, highKey := next() - bench.store.Range(From(lowKey).To(highKey)) + low, high := next() + bench.store.Range(bounds(low, high)) } }) b.Run("op=full", func(b *testing.B) { next := randomPairs(keys) for b.Loop() { - lowKey, highKey := next() - for k, v := range bench.store.Range(From(lowKey).To(highKey)) { + low, high := next() + for k, v := range bench.store.Range(bounds(low, high)) { _, _ = k, v } } @@ -540,9 +540,9 @@ func BenchmarkAsc(b *testing.B) { } next := randomPairs(keys) for b.Loop() { - lowKey, highKey := next() + low, high := next() ref.makeDirty() - for k, v := range ref.Range(From(lowKey).To(highKey)) { + for k, v := range ref.Range(bounds(low, high)) { _, _ = k, v } } @@ -551,40 +551,10 @@ func BenchmarkAsc(b *testing.B) { } } +func BenchmarkAsc(b *testing.B) { + benchRange(b, func(low, high []byte) *Bounds { return From(low).To(high) }) +} + func BenchmarkDesc(b *testing.B) { - for bench := range createTestStores(slices.Values(benchStoreConfigs)) { - b.Run(bench.name, func(b *testing.B) { - keys := boundKeys(bench.config.ref) - b.Run("op=init", func(b *testing.B) { - next := randomPairs(keys) - for b.Loop() { - lowKey, highKey := next() - bench.store.Range(From(highKey).DownTo(lowKey)) - } - }) - b.Run("op=full", func(b *testing.B) { - next := randomPairs(keys) - for b.Loop() { - lowKey, highKey := next() - for k, v := range bench.store.Range(From(highKey).DownTo(lowKey)) { - _, _ = k, v - } - } - }) - b.Run("op=full-dirty", func(b *testing.B) { - ref, ok := bench.store.(*reference) - if !ok { - b.Skipf("skipping store of type %T", bench.store) - } - next := randomPairs(keys) - for b.Loop() { - lowKey, highKey := next() - ref.makeDirty() - for k, v := range ref.Range(From(highKey).DownTo(lowKey)) { - _, _ = k, v - } - } - }) - }) - } + benchRange(b, func(low, high []byte) *Bounds { return From(high).DownTo(low) }) } From 53631081dd6128d604b06e929f690f70962803fb Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Mon, 14 Jul 2025 15:02:28 -0700 Subject: [PATCH 15/30] Fix linter errors, shadowing mostly. Reserve "low" and "high" for range keys, name test data differently. --- bench_test.go | 57 +++++--- bounds_test.go | 358 ++++++++++++++++++++++++------------------------- 2 files changed, 218 insertions(+), 197 deletions(-) diff --git a/bench_test.go b/bench_test.go index 0c1ab22..7309d18 100644 --- a/bench_test.go +++ b/bench_test.go @@ -172,8 +172,12 @@ func BenchmarkChildBounds(b *testing.B) { keySet{empty, nextKey(empty), nextKey(nextKey(empty)), after}, }, { - From(nil).To(high), - keySet{empty, high[:1], high[:2], high[:3], prevKey(high), high, nextKey(high), after}, + From(nil).To(highKey), + keySet{ + empty, + highKey[:1], highKey[:2], highKey[:3], prevKey(highKey), highKey, nextKey(highKey), + after, + }, }, { From(nil).To(nil), @@ -184,18 +188,23 @@ func BenchmarkChildBounds(b *testing.B) { keySet{empty, nextKey(empty), nextKey(nextKey(empty)), after}, }, { - From(empty).To(high), - keySet{empty, nextKey(empty), high[:1], high[:2], high[:3], prevKey(high), high, nextKey(high), after}, + From(empty).To(highKey), + keySet{ + empty, nextKey(empty), + highKey[:1], highKey[:2], highKey[:3], prevKey(highKey), highKey, nextKey(highKey), + after, + }, }, { From(empty).To(nil), keySet{empty, nextKey(empty), after}, }, { - From(nextKey(empty)).To(high), + From(nextKey(empty)).To(highKey), keySet{ - empty, nextKey(empty), nextKey(nextKey(empty)), high[:1], high[:2], high[:3], - prevKey(high), high, nextKey(high), after, + empty, nextKey(empty), nextKey(nextKey(empty)), + highKey[:1], highKey[:2], highKey[:3], prevKey(highKey), highKey, nextKey(highKey), + after, }, }, { @@ -203,32 +212,43 @@ func BenchmarkChildBounds(b *testing.B) { keySet{empty, nextKey(empty), nextKey(nextKey(empty)), after}, }, { - From(low).To(high), + From(lowKey).To(highKey), keySet{ - empty, nextKey(empty), low[:1], low[:2], low[:3], prevKey(low), low, nextKey(low), - high[:1], high[:2], high[:3], prevKey(high), high, nextKey(high), after, + empty, nextKey(empty), + lowKey[:1], lowKey[:2], lowKey[:3], prevKey(lowKey), lowKey, nextKey(lowKey), + highKey[:1], highKey[:2], highKey[:3], prevKey(highKey), highKey, nextKey(highKey), + after, }, }, { - From(low).To(nil), - keySet{empty, nextKey(empty), low[:1], low[:2], low[:3], prevKey(low), low, nextKey(low), after}, + From(lowKey).To(nil), + keySet{ + empty, nextKey(empty), + lowKey[:1], lowKey[:2], lowKey[:3], prevKey(lowKey), lowKey, nextKey(lowKey), + after, + }, }, // 2 byte common prefix { - From(low).To(low2), + From(lowKey).To(low2), keySet{ - empty, nextKey(empty), before, low[:1], low[:2], low[:3], prevKey(low), low, nextKey(low), - midLows, low2[:3], prevKey(low2), low2, nextKey(low2), after, + empty, nextKey(empty), before, + lowKey[:1], lowKey[:2], lowKey[:3], prevKey(lowKey), lowKey, nextKey(lowKey), + midLows, + low2[:3], prevKey(low2), low2, nextKey(low2), + after, }, }, // From is a prefix of To { - From(low[:2]).To(low), + From(lowKey[:2]).To(lowKey), keySet{ - empty, nextKey(empty), before, low[:1], prevKey(low[:2]), low[:2], nextKey(low[:2]), low[:3], - prevKey(low), low, nextKey(low), after, + empty, nextKey(empty), before, + lowKey[:1], prevKey(lowKey[:2]), lowKey[:2], nextKey(lowKey[:2]), + lowKey[:3], prevKey(lowKey), lowKey, nextKey(lowKey), + after, }, }, } { @@ -513,6 +533,7 @@ func BenchmarkAll(b *testing.B) { } } +//nolint:gocognit func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { diff --git a/bounds_test.go b/bounds_test.go index 4d91703..37874b6 100644 --- a/bounds_test.go +++ b/bounds_test.go @@ -14,12 +14,12 @@ const ( var ( // Keys used by Bounds testing and benchmarking. - empty = []byte{} - before = []byte{0x02, 0x27} - low = []byte{0x04, 0x99, 0x72, 0xD3} - within = []byte{0x27, 0x83, 0x02} - high = []byte{0x42, 0x12, 0xBC, 0x60} - after = []byte{0xA5, 0x02} + empty = []byte{} + before = []byte{0x02, 0x27} + lowKey = []byte{0x04, 0x99, 0x72, 0xD3} + within = []byte{0x27, 0x83, 0x02} + highKey = []byte{0x42, 0x12, 0xBC, 0x60} + after = []byte{0xA5, 0x02} // low < low2, they share a common prefix of 2 bytes. low2 = []byte{0x04, 0x99, 0x9E, 0x27} @@ -29,16 +29,16 @@ var ( func TestBoundsBuilderPanics(t *testing.T) { t.Parallel() assert.Panics(t, func() { - From(high).To(low) + From(highKey).To(lowKey) }) assert.Panics(t, func() { - From(low).DownTo(high) + From(lowKey).DownTo(highKey) }) assert.Panics(t, func() { - From(low).To(low) + From(lowKey).To(lowKey) }) assert.Panics(t, func() { - From(low).DownTo(low) + From(lowKey).DownTo(lowKey) }) } @@ -47,9 +47,9 @@ func TestBoundsBuilder(t *testing.T) { for _, tt := range []struct { first, second []byte }{ - {low, high}, - {nil, low}, - {low, nil}, + {lowKey, highKey}, + {nil, lowKey}, + {lowKey, nil}, {nil, nil}, } { t.Run(fmt.Sprintf("(%s,%s)", kv.KeyName(tt.first), kv.KeyName(tt.second)), func(t *testing.T) { @@ -90,78 +90,78 @@ func TestBoundsCompareKey(t *testing.T) { keySet{}, keySet{}, keySet{ - empty, nextKey(empty), before, prevKey(low), low, nextKey(low), within, - prevKey(high), high, nextKey(high), after, + empty, nextKey(empty), before, prevKey(lowKey), lowKey, nextKey(lowKey), within, + prevKey(highKey), highKey, nextKey(highKey), after, }, }, { - From(nil).To(low), + From(nil).To(lowKey), keySet{}, - keySet{empty, nextKey(empty), before, prevKey(low)}, - keySet{low, nextKey(low), within, prevKey(high), high, nextKey(high), after}, + keySet{empty, nextKey(empty), before, prevKey(lowKey)}, + keySet{lowKey, nextKey(lowKey), within, prevKey(highKey), highKey, nextKey(highKey), after}, }, { From(nil).To(nil), keySet{}, keySet{ - empty, nextKey(empty), before, prevKey(low), low, nextKey(low), within, - prevKey(high), high, nextKey(high), after, + empty, nextKey(empty), before, prevKey(lowKey), lowKey, nextKey(lowKey), within, + prevKey(highKey), highKey, nextKey(highKey), after, }, keySet{}, }, { - From(empty).To(low), + From(empty).To(lowKey), keySet{}, - keySet{empty, nextKey(empty), before, prevKey(low)}, - keySet{low, nextKey(low), within, prevKey(high), high, nextKey(high), after}, + keySet{empty, nextKey(empty), before, prevKey(lowKey)}, + keySet{lowKey, nextKey(lowKey), within, prevKey(highKey), highKey, nextKey(highKey), after}, }, { From(empty).To(nil), keySet{}, keySet{ - empty, nextKey(empty), before, prevKey(low), low, nextKey(low), within, - prevKey(high), high, nextKey(high), after, + empty, nextKey(empty), before, prevKey(lowKey), lowKey, nextKey(lowKey), within, + prevKey(highKey), highKey, nextKey(highKey), after, }, keySet{}, }, { - From(low[:2]).To(low), - keySet{empty, nextKey(empty), before, low[:1], prevKey(low[:2])}, - keySet{low[:2], nextKey(low[:2]), low[:3], prevKey(low)}, - keySet{low, nextKey(low), within, prevKey(high), high, nextKey(high), after}, + From(lowKey[:2]).To(lowKey), + keySet{empty, nextKey(empty), before, lowKey[:1], prevKey(lowKey[:2])}, + keySet{lowKey[:2], nextKey(lowKey[:2]), lowKey[:3], prevKey(lowKey)}, + keySet{lowKey, nextKey(lowKey), within, prevKey(highKey), highKey, nextKey(highKey), after}, }, { - From(low).To(low2), - keySet{empty, nextKey(empty), before, low[:1], low[:2], low[:3], prevKey(low)}, - keySet{low, nextKey(low), midLows, prevKey(low2)}, - keySet{low2, nextKey(low2), within, prevKey(high), high, nextKey(high), after}, + From(lowKey).To(low2), + keySet{empty, nextKey(empty), before, lowKey[:1], lowKey[:2], lowKey[:3], prevKey(lowKey)}, + keySet{lowKey, nextKey(lowKey), midLows, prevKey(low2)}, + keySet{low2, nextKey(low2), within, prevKey(highKey), highKey, nextKey(highKey), after}, }, { - From(low).To(high), - keySet{empty, nextKey(empty), before, prevKey(low)}, - keySet{low, nextKey(low), within, prevKey(high)}, - keySet{high, nextKey(high), after}, + From(lowKey).To(highKey), + keySet{empty, nextKey(empty), before, prevKey(lowKey)}, + keySet{lowKey, nextKey(lowKey), within, prevKey(highKey)}, + keySet{highKey, nextKey(highKey), after}, }, { - From(low).To(nil), - keySet{empty, nextKey(empty), before, prevKey(low)}, - keySet{low, nextKey(low), within, prevKey(high), high, nextKey(high), after}, + From(lowKey).To(nil), + keySet{empty, nextKey(empty), before, prevKey(lowKey)}, + keySet{lowKey, nextKey(lowKey), within, prevKey(highKey), highKey, nextKey(highKey), after}, keySet{}, }, // reverse bounds { - From(nil).DownTo(low), + From(nil).DownTo(lowKey), keySet{}, - keySet{nextKey(low), within, prevKey(high), high, nextKey(high), after}, - keySet{empty, nextKey(empty), before, prevKey(low), low}, + keySet{nextKey(lowKey), within, prevKey(highKey), highKey, nextKey(highKey), after}, + keySet{empty, nextKey(empty), before, prevKey(lowKey), lowKey}, }, { From(nil).DownTo(empty), keySet{}, keySet{ - nextKey(empty), before, prevKey(low), low, nextKey(low), within, - prevKey(high), high, nextKey(high), after, + nextKey(empty), before, prevKey(lowKey), lowKey, nextKey(lowKey), within, + prevKey(highKey), highKey, nextKey(highKey), after, }, keySet{empty}, }, @@ -169,46 +169,46 @@ func TestBoundsCompareKey(t *testing.T) { From(nil).DownTo(nil), keySet{}, keySet{ - empty, nextKey(empty), before, prevKey(low), low, nextKey(low), within, - prevKey(high), high, nextKey(high), after, + empty, nextKey(empty), before, prevKey(lowKey), lowKey, nextKey(lowKey), within, + prevKey(highKey), highKey, nextKey(highKey), after, }, keySet{}, }, { - From(high).DownTo(low), - keySet{nextKey(high), after}, - keySet{nextKey(low), within, prevKey(high), high}, - keySet{empty, nextKey(empty), before, prevKey(low), low}, + From(highKey).DownTo(lowKey), + keySet{nextKey(highKey), after}, + keySet{nextKey(lowKey), within, prevKey(highKey), highKey}, + keySet{empty, nextKey(empty), before, prevKey(lowKey), lowKey}, }, { - From(low).DownTo(low[:2]), - keySet{nextKey(low), within, prevKey(high), high, nextKey(high), after}, - keySet{nextKey(low[:2]), low[:3], prevKey(low), low}, - keySet{empty, nextKey(empty), before, low[:1], low[:2], prevKey(low[:2])}, + From(lowKey).DownTo(lowKey[:2]), + keySet{nextKey(lowKey), within, prevKey(highKey), highKey, nextKey(highKey), after}, + keySet{nextKey(lowKey[:2]), lowKey[:3], prevKey(lowKey), lowKey}, + keySet{empty, nextKey(empty), before, lowKey[:1], lowKey[:2], prevKey(lowKey[:2])}, }, { - From(low2).DownTo(low), - keySet{nextKey(low2), within, prevKey(high), high, nextKey(high), after}, - keySet{nextKey(low), midLows, prevKey(low2), low2}, - keySet{empty, nextKey(empty), before, prevKey(low), low[:1], low[:2], low[:3], low}, + From(low2).DownTo(lowKey), + keySet{nextKey(low2), within, prevKey(highKey), highKey, nextKey(highKey), after}, + keySet{nextKey(lowKey), midLows, prevKey(low2), low2}, + keySet{empty, nextKey(empty), before, prevKey(lowKey), lowKey[:1], lowKey[:2], lowKey[:3], lowKey}, }, { - From(low).DownTo(empty), - keySet{nextKey(low), within, prevKey(high), high, nextKey(high), after}, - keySet{nextKey(empty), before, prevKey(low), low}, + From(lowKey).DownTo(empty), + keySet{nextKey(lowKey), within, prevKey(highKey), highKey, nextKey(highKey), after}, + keySet{nextKey(empty), before, prevKey(lowKey), lowKey}, keySet{empty}, }, { - From(low).DownTo(nil), - keySet{nextKey(low), within, prevKey(high), high, nextKey(high), after}, - keySet{empty, nextKey(empty), before, prevKey(low), low}, + From(lowKey).DownTo(nil), + keySet{nextKey(lowKey), within, prevKey(highKey), highKey, nextKey(highKey), after}, + keySet{empty, nextKey(empty), before, prevKey(lowKey), lowKey}, keySet{}, }, { From(empty).DownTo(nil), keySet{ - nextKey(empty), before, prevKey(low), low, nextKey(low), within, - prevKey(high), high, nextKey(high), after, + nextKey(empty), before, prevKey(lowKey), lowKey, nextKey(lowKey), within, + prevKey(highKey), highKey, nextKey(highKey), after, }, keySet{empty}, keySet{}, @@ -261,17 +261,17 @@ func TestChildBounds(t *testing.T) { }, }, { - From(nil).To(low), + From(nil).To(lowKey), []expectedChildBounds{ - {empty, 0, low[0], true}, + {empty, 0, lowKey[0], true}, {nextKey(empty), 0, maxByte, true}, {before, 0, maxByte, true}, - {low[:1], 0, low[1], true}, - {low[:2], 0, low[2], true}, - {low[:3], 0, low[3], true}, - {prevKey(low), 0, maxByte, true}, - {low, 0, 0, false}, - {nextKey(low), 0, 0, false}, + {lowKey[:1], 0, lowKey[1], true}, + {lowKey[:2], 0, lowKey[2], true}, + {lowKey[:3], 0, lowKey[3], true}, + {prevKey(lowKey), 0, maxByte, true}, + {lowKey, 0, 0, false}, + {nextKey(lowKey), 0, 0, false}, }, }, { @@ -284,17 +284,17 @@ func TestChildBounds(t *testing.T) { }, }, { - From(empty).To(low), + From(empty).To(lowKey), []expectedChildBounds{ - {empty, 0, low[0], true}, + {empty, 0, lowKey[0], true}, {nextKey(empty), 0, maxByte, true}, {before, 0, maxByte, true}, - {low[:1], 0, low[1], true}, - {low[:2], 0, low[2], true}, - {low[:3], 0, low[3], true}, - {prevKey(low), 0, maxByte, true}, - {low, 0, 0, false}, - {nextKey(low), 0, 0, false}, + {lowKey[:1], 0, lowKey[1], true}, + {lowKey[:2], 0, lowKey[2], true}, + {lowKey[:3], 0, lowKey[3], true}, + {prevKey(lowKey), 0, maxByte, true}, + {lowKey, 0, 0, false}, + {nextKey(lowKey), 0, 0, false}, }, }, { @@ -307,58 +307,58 @@ func TestChildBounds(t *testing.T) { }, }, { - From(low).To(high), + From(lowKey).To(highKey), []expectedChildBounds{ - {empty, low[0], high[0], true}, + {empty, lowKey[0], highKey[0], true}, {nextKey(empty), 0, 0, false}, {before, 0, 0, false}, - {low[:1], low[1], maxByte, true}, - {low[:2], low[2], maxByte, true}, - {low[:3], low[3], maxByte, true}, - {prevKey(low), 0, 0, false}, - {low, 0, maxByte, true}, - {nextKey(low), 0, maxByte, true}, + {lowKey[:1], lowKey[1], maxByte, true}, + {lowKey[:2], lowKey[2], maxByte, true}, + {lowKey[:3], lowKey[3], maxByte, true}, + {prevKey(lowKey), 0, 0, false}, + {lowKey, 0, maxByte, true}, + {nextKey(lowKey), 0, maxByte, true}, {within, 0, maxByte, true}, - {high[:1], 0, high[1], true}, - {high[:2], 0, high[2], true}, - {high[:3], 0, high[3], true}, - {prevKey(high), 0, maxByte, true}, - {high, 0, 0, false}, - {nextKey(high), 0, 0, false}, + {highKey[:1], 0, highKey[1], true}, + {highKey[:2], 0, highKey[2], true}, + {highKey[:3], 0, highKey[3], true}, + {prevKey(highKey), 0, maxByte, true}, + {highKey, 0, 0, false}, + {nextKey(highKey), 0, 0, false}, {after, 0, 0, false}, }, }, { - From(low).To(nil), + From(lowKey).To(nil), []expectedChildBounds{ - {empty, low[0], maxByte, true}, + {empty, lowKey[0], maxByte, true}, {nextKey(empty), 0, 0, false}, {before, 0, 0, false}, - {low[:1], low[1], maxByte, true}, - {low[:2], low[2], maxByte, true}, - {low[:3], low[3], maxByte, true}, - {prevKey(low), 0, 0, false}, - {low, 0, maxByte, true}, - {nextKey(low), 0, maxByte, true}, + {lowKey[:1], lowKey[1], maxByte, true}, + {lowKey[:2], lowKey[2], maxByte, true}, + {lowKey[:3], lowKey[3], maxByte, true}, + {prevKey(lowKey), 0, 0, false}, + {lowKey, 0, maxByte, true}, + {nextKey(lowKey), 0, maxByte, true}, {after, 0, maxByte, true}, }, }, // reverse, begin[0] != end[0] { - From(nil).DownTo(low), + From(nil).DownTo(lowKey), []expectedChildBounds{ {after, maxByte, 0, true}, {within, maxByte, 0, true}, - {nextKey(low), maxByte, 0, true}, - {low, maxByte, 0, true}, - {prevKey(low), 0, 0, false}, - {low[:3], maxByte, low[3], true}, - {low[:2], maxByte, low[2], true}, - {low[:1], maxByte, low[1], true}, + {nextKey(lowKey), maxByte, 0, true}, + {lowKey, maxByte, 0, true}, + {prevKey(lowKey), 0, 0, false}, + {lowKey[:3], maxByte, lowKey[3], true}, + {lowKey[:2], maxByte, lowKey[2], true}, + {lowKey[:1], maxByte, lowKey[1], true}, {before, 0, 0, false}, {nextKey(empty), 0, 0, false}, - {empty, maxByte, low[0], true}, + {empty, maxByte, lowKey[0], true}, }, }, { @@ -380,57 +380,57 @@ func TestChildBounds(t *testing.T) { }, }, { - From(high).DownTo(low), + From(highKey).DownTo(lowKey), []expectedChildBounds{ {after, 0, 0, false}, - {nextKey(high), 0, 0, false}, - {high, 0, 0, false}, - {prevKey(high), maxByte, 0, true}, - {high[:3], high[3], 0, true}, - {high[:2], high[2], 0, true}, - {high[:1], high[1], 0, true}, + {nextKey(highKey), 0, 0, false}, + {highKey, 0, 0, false}, + {prevKey(highKey), maxByte, 0, true}, + {highKey[:3], highKey[3], 0, true}, + {highKey[:2], highKey[2], 0, true}, + {highKey[:1], highKey[1], 0, true}, {within, maxByte, 0, true}, - {nextKey(low), maxByte, 0, true}, - {low, maxByte, 0, true}, - {prevKey(low), 0, 0, false}, - {low[:3], maxByte, low[3], true}, - {low[:2], maxByte, low[2], true}, - {low[:1], maxByte, low[1], true}, + {nextKey(lowKey), maxByte, 0, true}, + {lowKey, maxByte, 0, true}, + {prevKey(lowKey), 0, 0, false}, + {lowKey[:3], maxByte, lowKey[3], true}, + {lowKey[:2], maxByte, lowKey[2], true}, + {lowKey[:1], maxByte, lowKey[1], true}, {before, 0, 0, false}, {nextKey(empty), 0, 0, false}, - {empty, high[0], low[0], true}, + {empty, highKey[0], lowKey[0], true}, }, }, { - From(low).DownTo(empty), + From(lowKey).DownTo(empty), []expectedChildBounds{ {after, 0, 0, false}, {within, 0, 0, false}, - {nextKey(low), 0, 0, false}, - {low, 0, 0, false}, - {prevKey(low), maxByte, 0, true}, - {low[:3], low[3], 0, true}, - {low[:2], low[2], 0, true}, - {low[:1], low[1], 0, true}, + {nextKey(lowKey), 0, 0, false}, + {lowKey, 0, 0, false}, + {prevKey(lowKey), maxByte, 0, true}, + {lowKey[:3], lowKey[3], 0, true}, + {lowKey[:2], lowKey[2], 0, true}, + {lowKey[:1], lowKey[1], 0, true}, {before, maxByte, 0, true}, {nextKey(empty), maxByte, 0, true}, - {empty, low[0], 0, true}, + {empty, lowKey[0], 0, true}, }, }, { - From(low).DownTo(nil), + From(lowKey).DownTo(nil), []expectedChildBounds{ {after, 0, 0, false}, {within, 0, 0, false}, - {nextKey(low), 0, 0, false}, - {low, 0, 0, false}, - {prevKey(low), maxByte, 0, true}, - {low[:3], low[3], 0, true}, - {low[:2], low[2], 0, true}, - {low[:1], low[1], 0, true}, + {nextKey(lowKey), 0, 0, false}, + {lowKey, 0, 0, false}, + {prevKey(lowKey), maxByte, 0, true}, + {lowKey[:3], lowKey[3], 0, true}, + {lowKey[:2], lowKey[2], 0, true}, + {lowKey[:1], lowKey[1], 0, true}, {before, maxByte, 0, true}, {nextKey(empty), maxByte, 0, true}, - {empty, low[0], 0, true}, + {empty, lowKey[0], 0, true}, }, }, { @@ -444,17 +444,17 @@ func TestChildBounds(t *testing.T) { // forward, 2 byte common prefix { - From(low).To(low2), + From(lowKey).To(low2), []expectedChildBounds{ - {empty, low[0], low[0], true}, + {empty, lowKey[0], lowKey[0], true}, {nextKey(empty), 0, 0, false}, {before, 0, 0, false}, - {low[:1], low[1], low[1], true}, - {low[:2], low[2], low2[2], true}, - {low[:3], low[3], maxByte, true}, - {prevKey(low), 0, 0, false}, - {low, 0, maxByte, true}, - {nextKey(low), 0, maxByte, true}, + {lowKey[:1], lowKey[1], lowKey[1], true}, + {lowKey[:2], lowKey[2], low2[2], true}, + {lowKey[:3], lowKey[3], maxByte, true}, + {prevKey(lowKey), 0, 0, false}, + {lowKey, 0, maxByte, true}, + {nextKey(lowKey), 0, maxByte, true}, {midLows, 0, maxByte, true}, {low2[:3], 0, low2[3], true}, {prevKey(low2), 0, maxByte, true}, @@ -466,7 +466,7 @@ func TestChildBounds(t *testing.T) { // reverse, 2 byte common prefix { - From(low2).DownTo(low), + From(low2).DownTo(lowKey), []expectedChildBounds{ {after, 0, 0, false}, {nextKey(low2), 0, 0, false}, @@ -474,53 +474,53 @@ func TestChildBounds(t *testing.T) { {prevKey(low2), maxByte, 0, true}, {low2[:3], low2[3], 0, true}, {midLows, maxByte, 0, true}, - {nextKey(low), maxByte, 0, true}, - {low, maxByte, 0, true}, - {prevKey(low), 0, 0, false}, - {low[:3], maxByte, low[3], true}, - {low[:2], low2[2], low[2], true}, - {low[:1], low[1], low[1], true}, + {nextKey(lowKey), maxByte, 0, true}, + {lowKey, maxByte, 0, true}, + {prevKey(lowKey), 0, 0, false}, + {lowKey[:3], maxByte, lowKey[3], true}, + {lowKey[:2], low2[2], lowKey[2], true}, + {lowKey[:1], lowKey[1], lowKey[1], true}, {before, 0, 0, false}, {nextKey(empty), 0, 0, false}, - {empty, low[0], low[0], true}, + {empty, lowKey[0], lowKey[0], true}, }, }, // forward, From is a prefix of To { - From(low[:2]).To(low), + From(lowKey[:2]).To(lowKey), []expectedChildBounds{ - {empty, low[0], low[0], true}, + {empty, lowKey[0], lowKey[0], true}, {nextKey(empty), 0, 0, false}, {before, 0, 0, false}, - {low[:1], low[1], low[1], true}, - {prevKey(low[:2]), 0, 0, false}, - {low[:2], 0, low[2], true}, - {nextKey(low[:2]), 0, maxByte, true}, - {low[:3], 0, low[3], true}, - {prevKey(low), 0, maxByte, true}, - {low, 0, 0, false}, - {nextKey(low), 0, 0, false}, + {lowKey[:1], lowKey[1], lowKey[1], true}, + {prevKey(lowKey[:2]), 0, 0, false}, + {lowKey[:2], 0, lowKey[2], true}, + {nextKey(lowKey[:2]), 0, maxByte, true}, + {lowKey[:3], 0, lowKey[3], true}, + {prevKey(lowKey), 0, maxByte, true}, + {lowKey, 0, 0, false}, + {nextKey(lowKey), 0, 0, false}, {after, 0, 0, false}, }, }, // reverse, DownTo is a prefix of From { - From(low).DownTo(low[:2]), + From(lowKey).DownTo(lowKey[:2]), []expectedChildBounds{ {after, 0, 0, false}, - {nextKey(low), 0, 0, false}, - {low, 0, 0, false}, - {prevKey(low), maxByte, 0, true}, - {low[:3], low[3], 0, true}, - {nextKey(low[:2]), maxByte, 0, true}, - {low[:2], low[2], 0, true}, - {prevKey(low[:2]), 0, 0, false}, - {low[:1], low[1], low[1], true}, + {nextKey(lowKey), 0, 0, false}, + {lowKey, 0, 0, false}, + {prevKey(lowKey), maxByte, 0, true}, + {lowKey[:3], lowKey[3], 0, true}, + {nextKey(lowKey[:2]), maxByte, 0, true}, + {lowKey[:2], lowKey[2], 0, true}, + {prevKey(lowKey[:2]), 0, 0, false}, + {lowKey[:1], lowKey[1], lowKey[1], true}, {before, 0, 0, false}, {nextKey(empty), 0, 0, false}, - {empty, low[0], low[0], true}, + {empty, lowKey[0], lowKey[0], true}, }, }, } { From 782bbc707708cfcae826473c6436cff3af7a07f1 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Mon, 14 Jul 2025 15:11:42 -0700 Subject: [PATCH 16/30] Add interface for makeDirty/refresh methods. This currently only applies to reference, but there will be more implementations. --- bench_test.go | 9 ++++++--- kv_test.go | 7 +++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/bench_test.go b/bench_test.go index 7309d18..b1d25c3 100644 --- a/bench_test.go +++ b/bench_test.go @@ -546,6 +546,9 @@ func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { } }) b.Run("op=full", func(b *testing.B) { + if d, ok := bench.store.(dirtyable); ok { + d.refresh() + } next := randomPairs(keys) for b.Loop() { low, high := next() @@ -555,15 +558,15 @@ func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { } }) b.Run("op=full-dirty", func(b *testing.B) { - ref, ok := bench.store.(*reference) + d, ok := bench.store.(dirtyable) if !ok { b.Skipf("skipping store of type %T", bench.store) } next := randomPairs(keys) for b.Loop() { low, high := next() - ref.makeDirty() - for k, v := range ref.Range(bounds(low, high)) { + d.makeDirty() + for k, v := range bench.store.Range(bounds(low, high)) { _, _ = k, v } } diff --git a/kv_test.go b/kv_test.go index d1d58e7..8e38483 100644 --- a/kv_test.go +++ b/kv_test.go @@ -18,6 +18,13 @@ type ( Bounds = kv.Bounds keySet = [][]byte // instances will generally have unique keys + // Used when benchmarking to force state changes. + // Currently only implemented by reference. + dirtyable interface { + makeDirty() + refresh() + } + implDef struct { name string factory func() ByteStore From f2d1a42a9217eabc7b1f87c03860e7084df76544 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:13:26 -0700 Subject: [PATCH 17/30] Return indices instead of sub-slices. --- reference_test.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/reference_test.go b/reference_test.go index fb94bbe..07bf8b8 100644 --- a/reference_test.go +++ b/reference_test.go @@ -110,15 +110,16 @@ func (r *reference) All() iter.Seq2[[]byte, byte] { } } -func (r *reference) between(low, high []byte) [][]byte { +func (r *reference) between(low, high []byte) (int, int) { lowIndex, highIndex := 0, len(r.ascKeys) if low != nil { lowIndex, _ = slices.BinarySearchFunc(r.ascKeys, low, bytes.Compare) } if high != nil { - highIndex, _ = slices.BinarySearchFunc(r.ascKeys, high, bytes.Compare) + highIndex, _ = slices.BinarySearchFunc(r.ascKeys[lowIndex:], high, bytes.Compare) + highIndex += lowIndex } - return r.ascKeys[lowIndex:highIndex] + return lowIndex, highIndex } func (r *reference) Asc(low, high []byte) iter.Seq2[[]byte, byte] { @@ -127,7 +128,9 @@ func (r *reference) Asc(low, high []byte) iter.Seq2[[]byte, byte] { } return func(yield func([]byte, byte) bool) { r.refresh() - for _, key := range r.between(low, high) { + lowIndex, highIndex := r.between(low, high) + for i := lowIndex; i < highIndex; i++ { + key := r.ascKeys[i] if !yield(key, r.entries[string(key)]) { return } @@ -141,7 +144,9 @@ func (r *reference) Desc(low, high []byte) iter.Seq2[[]byte, byte] { } return func(yield func([]byte, byte) bool) { r.refresh() - for _, key := range slices.Backward(r.between(low, high)) { + lowIndex, highIndex := r.between(low, high) + for i := highIndex - 1; i >= lowIndex; i-- { + key := r.ascKeys[i] if !yield(key, r.entries[string(key)]) { return } From 514249b0717c0f6258df4cd9e883833536caf775 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:59:48 -0700 Subject: [PATCH 18/30] Minor cleanup. --- fuzz_test.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/fuzz_test.go b/fuzz_test.go index 1b46dbc..a456db5 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -51,19 +51,16 @@ func keyForFuzzInputs(fuzzKey uint32, fuzzKeyLen byte) []byte { } func createFuzzStoreConfigs(size int) []*storeConfig { - var config storeConfig random := rand.New(rand.NewPCG(rand.Uint64(), rand.Uint64())) - config.name = "fuzz" - config.size = size - config.ref = newReference() + ref := newReference() for count := 0; count < size; { key := randomKey(fuzzMeanKeyLen, random) - if _, ok := config.ref.Get(key); !ok { - config.ref.Set(key, randomByte(random)) + if _, ok := ref.Get(key); !ok { + ref.Set(key, randomByte(random)) count++ } } - return []*storeConfig{&config} + return []*storeConfig{{"fuzz", size, ref}} } func FuzzGet(f *testing.F) { From 569ed32b9356ec8ec77a9c3c9a35348d699cc8b5 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Mon, 14 Jul 2025 18:27:13 -0700 Subject: [PATCH 19/30] Ensure reference stores are not dirty when created. --- bench_test.go | 1 + kv_test.go | 1 + 2 files changed, 2 insertions(+) diff --git a/bench_test.go b/bench_test.go index b1d25c3..2f74109 100644 --- a/bench_test.go +++ b/bench_test.go @@ -300,6 +300,7 @@ func createBenchStoreConfig(corpusName string, entries map[string]byte) *storeCo for k, v := range entries { ref.Set([]byte(k), v) } + ref.refresh() return &storeConfig{ name: fmt.Sprintf("corpus=%s/size=%d", corpusName, len(entries)), size: len(entries), diff --git a/kv_test.go b/kv_test.go index 8e38483..4627b3c 100644 --- a/kv_test.go +++ b/kv_test.go @@ -339,6 +339,7 @@ func createTestStoreConfigs() iter.Seq[*storeConfig] { ref.Set(testPresentKeys[i], byte(i)) size++ } + ref.refresh() if !yield(&storeConfig{"sub-store=" + name, size, ref}) { return } From baf7eb86ac6daf8e1aa823e89d85fb958e83b44e Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:05:32 -0700 Subject: [PATCH 20/30] Remove Cloneable, just recreate mutated test stores. --- bench_test.go | 24 ++++--------------- export_test.go | 54 ++++++----------------------------------- fuzz_test.go | 14 ++++++++--- kv_test.go | 61 ++++++++--------------------------------------- reference_test.go | 9 ------- 5 files changed, 32 insertions(+), 130 deletions(-) diff --git a/bench_test.go b/bench_test.go index 2f74109..010f152 100644 --- a/bench_test.go +++ b/bench_test.go @@ -349,20 +349,6 @@ func BenchmarkCreate(b *testing.B) { } } -// For mutable implementations, Clone() should be efficient, but not absurdly efficient. -// If it is, that's a sign it's sharing storage instead of creating new storage. -// This also helps to understand how Clone() can impact other benchmarks which use it. -func BenchmarkClone(b *testing.B) { - for bench := range createTestStores(slices.Values(benchStoreConfigs)) { - original := bench.store - b.Run(bench.name, func(b *testing.B) { - for b.Loop() { - _ = original.Clone() - } - }) - } -} - // This benchmark is for memory allocations, not time. // Creates one store and sets many keys per benchmark iteration. func BenchmarkSparse(b *testing.B) { @@ -457,14 +443,13 @@ func BenchmarkSet(b *testing.B) { } }) b.Run("existing=false", func(b *testing.B) { - store := bench.store.Clone() next := repeat(slices.Collect(absentKeys(bench.config.ref)), func() { b.StopTimer() - store = bench.store.Clone() + bench.resetFromConfig() b.StartTimer() }) for b.Loop() { - store.Set(next(), 42) + bench.store.Set(next(), 42) } }) }) @@ -475,14 +460,13 @@ func BenchmarkDelete(b *testing.B) { for bench := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(bench.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { - store := bench.store.Clone() next := repeat(slices.Collect(keyIter(bench.config.ref.All())), func() { b.StopTimer() - store = bench.store.Clone() + bench.resetFromConfig() b.StartTimer() }) for b.Loop() { - store.Delete(next()) + bench.store.Delete(next()) } }) b.Run("existing=false", func(b *testing.B) { diff --git a/export_test.go b/export_test.go index 2118545..155f935 100644 --- a/export_test.go +++ b/export_test.go @@ -4,57 +4,17 @@ package kv // The identifiers are in the kv package, but the filename ends in _test.go, // preventing their inclusion in the public API. -var ( - TestingChildBounds = (*Bounds).childBounds - TestingPreOrder = preOrder[int] - TestingPostOrder = postOrder[int] - TestingPreOrderPaths = preOrderPaths[int] - TestingPostOrderPaths = postOrderPaths[int] -) - type ( - Cloneable[V any] interface { - Store[V] - Clone() Cloneable[V] - } - TestingAdjFunction = adjFunction[int] TestingTraverser = traverser[int] TestingPathAdjFunction = pathAdjFunction[int] TestingPathTraverser = pathTraverser[int] ) -// Assumes V is not a reference type. -func (n *ptrTrieNode[V]) Clone() Cloneable[V] { - return clonePointerTrie(n) -} - -func clonePointerTrie[V any](n *ptrTrieNode[V]) *ptrTrieNode[V] { - clone := *n - clone.children = make([]*ptrTrieNode[V], len(n.children)) - for i, child := range n.children { - clone.children[i] = clonePointerTrie(child) - } - return &clone -} - -// Assumes V is not a reference type. -func (n *arrayTrieNode[V]) Clone() Cloneable[V] { - return cloneArrayTrie(n) -} - -func cloneArrayTrie[V any](n *arrayTrieNode[V]) *arrayTrieNode[V] { - if n == nil { - return nil - } - clone := *n - if n.children != nil { - clone.children = &[256]*arrayTrieNode[V]{} - for i, child := range n.children { - if child != nil { - clone.children[i] = cloneArrayTrie(child) - } - } - } - return &clone -} +var ( + TestingChildBounds = (*Bounds).childBounds + TestingPreOrder = preOrder[int] + TestingPostOrder = postOrder[int] + TestingPreOrderPaths = preOrderPaths[int] + TestingPostOrderPaths = postOrderPaths[int] +) diff --git a/fuzz_test.go b/fuzz_test.go index a456db5..7bc6bc5 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -3,6 +3,7 @@ package kv_test import ( "bytes" "encoding/binary" + "maps" rand "math/rand/v2" "slices" "testing" @@ -63,6 +64,13 @@ func createFuzzStoreConfigs(size int) []*storeConfig { return []*storeConfig{{"fuzz", size, ref}} } +func createReferenceStore(config *storeConfig) ByteStore { + return &reference{ + entries: maps.Clone(config.ref.entries), + dirty: true, + } +} + func FuzzGet(f *testing.F) { fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzStoreConfigs))) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen byte) { @@ -81,7 +89,7 @@ func FuzzSet(f *testing.F) { // This only works because there is only one fuzz store config. // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. - ref := fuzzStoreConfigs[0].ref.Clone() + ref := createReferenceStore(fuzzStoreConfigs[0]) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen, value byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) expected, expectedOk := ref.Set(key, value) @@ -101,7 +109,7 @@ func FuzzDelete(f *testing.F) { // This only works because there is only one fuzz store config. // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. - ref := fuzzStoreConfigs[0].ref.Clone() + ref := createReferenceStore(fuzzStoreConfigs[0]) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) expected, expectedOk := ref.Delete(key) @@ -143,7 +151,7 @@ func FuzzMixed(f *testing.F) { // This only works because there is only one fuzz store config. // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. - ref := fuzzStoreConfigs[0].ref.Clone() + ref := createReferenceStore(fuzzStoreConfigs[0]) f.Fuzz(func(t *testing.T, fuzzSetKey, fuzzDeleteKey uint32, fuzzSetKeyLen, fuzzDeleteKeyLen, value byte) { key := keyForFuzzInputs(fuzzSetKey, fuzzSetKeyLen) expected, expectedOk := ref.Set(key, value) diff --git a/kv_test.go b/kv_test.go index 4627b3c..a73b0c2 100644 --- a/kv_test.go +++ b/kv_test.go @@ -14,7 +14,7 @@ import ( ) type ( - ByteStore = kv.Cloneable[byte] + ByteStore = kv.Store[byte] Bounds = kv.Bounds keySet = [][]byte // instances will generally have unique keys @@ -57,9 +57,9 @@ const ( var ( implDefs = []*implDef{ - {"impl=reference", func() ByteStore { return ByteStore(newReference()) }}, - {"impl=pointer-trie", asCloneable(kv.NewPointerTrie[byte])}, - {"impl=array-trie", asCloneable(kv.NewArrayTrie[byte])}, + {"impl=reference", func() ByteStore { return newReference() }}, + {"impl=pointer-trie", kv.NewPointerTrie[byte]}, + {"impl=array-trie", kv.NewArrayTrie[byte]}, } From = kv.From @@ -160,15 +160,13 @@ func TestPrevKey(t *testing.T) { } } -func asCloneable(factory func() kv.Store[byte]) func() ByteStore { - return func() ByteStore { - store := factory() - cloneable, ok := store.(ByteStore) - if !ok { - panic(fmt.Sprintf("%T is not Cloneable", store)) - } - return cloneable +// Recreates s.store. +func (s *testStore) resetFromConfig() { + store := s.def.factory() + for k, v := range s.config.ref.Asc(nil, nil) { + store.Set([]byte(k), v) } + s.store = store } // Returns an iterator over the keys of itr. @@ -641,45 +639,6 @@ func TestStores(t *testing.T) { } } -func TestClone(t *testing.T) { - t.Parallel() - for test := range createTestStores(createTestStoreConfigs()) { - t.Run(test.name, func(t *testing.T) { - t.Parallel() - original := test.store - assertSame(t, test.config.ref, original) - - // test that the clone was correct - store := original.Clone() - assertSame(t, test.config.ref, store) - - // mutate the clone and test that original hasn't changed - for k := range test.config.ref.All() { - store.Delete(k) - } - assertIterEmpty(t, store.Range(forwardAll)) - i := 0 - for k := range absentKeys(test.config.ref) { - store.Set(k, byte(i)) - } - assertSame(t, test.config.ref, original) - - // mutate the original and test that the clone hasn't changed - store = original.Clone() - for k := range test.config.ref.All() { - original.Delete(k) - } - assertIterEmpty(t, original.Range(forwardAll)) - i = 0 - for k := range absentKeys(test.config.ref) { - original.Set(k, byte(i)) - i++ - } - assertSame(t, test.config.ref, store) - }) - } -} - // Things that failed at one point or another during testing. func assertIterEmpty[V any](t *testing.T, actual iter.Seq2[[]byte, V]) bool { diff --git a/reference_test.go b/reference_test.go index 07bf8b8..adebac0 100644 --- a/reference_test.go +++ b/reference_test.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "iter" - "maps" "slices" "strings" @@ -26,14 +25,6 @@ func newReference() *reference { } } -func (r *reference) Clone() ByteStore { - return &reference{ - maps.Clone(r.entries), - slices.Clone(r.ascKeys), - r.dirty, - } -} - func (r *reference) makeDirty() { r.ascKeys = nil r.dirty = true From 5da859ebe759b27d26940fc8376dc6302178eccf Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:24:46 -0700 Subject: [PATCH 21/30] Rename testStore to storeUnderTest. Also promoted the store field to an embedded ByteStore field. This makes storeUnderTest a Store[byte] with additional metadata. --- bench_test.go | 76 +++++++++++++++++++++++++-------------------------- fuzz_test.go | 22 +++++++-------- kv_test.go | 49 ++++++++++++++++----------------- 3 files changed, 73 insertions(+), 74 deletions(-) diff --git a/bench_test.go b/bench_test.go index 010f152..b6dd81a 100644 --- a/bench_test.go +++ b/bench_test.go @@ -337,12 +337,12 @@ func BenchmarkFactory(b *testing.B) { } func BenchmarkCreate(b *testing.B) { - for bench := range createTestStores(slices.Values(benchStoreConfigs)) { - b.Run(bench.name, func(b *testing.B) { + for store := range createTestStores(slices.Values(benchStoreConfigs)) { + b.Run(store.name, func(b *testing.B) { for b.Loop() { - store := bench.def.factory() - for k, v := range bench.config.ref.All() { - store.Set(k, v) + s := store.def.factory() + for k, v := range store.config.ref.All() { + s.Set(k, v) } } }) @@ -415,18 +415,18 @@ func BenchmarkDense(b *testing.B) { } func BenchmarkGet(b *testing.B) { - for bench := range createTestStores(slices.Values(benchStoreConfigs)) { - b.Run(bench.name, func(b *testing.B) { + for store := range createTestStores(slices.Values(benchStoreConfigs)) { + b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { - next := repeat(slices.Collect(keyIter(bench.config.ref.All())), nil) + next := repeat(slices.Collect(keyIter(store.config.ref.All())), nil) for b.Loop() { - bench.store.Get(next()) + store.Get(next()) } }) b.Run("existing=false", func(b *testing.B) { - next := repeat(slices.Collect(absentKeys(bench.config.ref)), nil) + next := repeat(slices.Collect(absentKeys(store.config.ref)), nil) for b.Loop() { - bench.store.Get(next()) + store.Get(next()) } }) }) @@ -434,22 +434,22 @@ func BenchmarkGet(b *testing.B) { } func BenchmarkSet(b *testing.B) { - for bench := range createTestStores(slices.Values(benchStoreConfigs)) { - b.Run(bench.name, func(b *testing.B) { + for store := range createTestStores(slices.Values(benchStoreConfigs)) { + b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { - next := repeat(slices.Collect(keyIter(bench.config.ref.All())), nil) + next := repeat(slices.Collect(keyIter(store.config.ref.All())), nil) for b.Loop() { - bench.store.Set(next(), 42) + store.Set(next(), 42) } }) b.Run("existing=false", func(b *testing.B) { - next := repeat(slices.Collect(absentKeys(bench.config.ref)), func() { + next := repeat(slices.Collect(absentKeys(store.config.ref)), func() { b.StopTimer() - bench.resetFromConfig() + store.resetFromConfig() b.StartTimer() }) for b.Loop() { - bench.store.Set(next(), 42) + store.Set(next(), 42) } }) }) @@ -457,22 +457,22 @@ func BenchmarkSet(b *testing.B) { } func BenchmarkDelete(b *testing.B) { - for bench := range createTestStores(slices.Values(benchStoreConfigs)) { - b.Run(bench.name, func(b *testing.B) { + for store := range createTestStores(slices.Values(benchStoreConfigs)) { + b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { - next := repeat(slices.Collect(keyIter(bench.config.ref.All())), func() { + next := repeat(slices.Collect(keyIter(store.config.ref.All())), func() { b.StopTimer() - bench.resetFromConfig() + store.resetFromConfig() b.StartTimer() }) for b.Loop() { - bench.store.Delete(next()) + store.Delete(next()) } }) b.Run("existing=false", func(b *testing.B) { - next := repeat(slices.Collect(absentKeys(bench.config.ref)), nil) + next := repeat(slices.Collect(absentKeys(store.config.ref)), nil) for b.Loop() { - bench.store.Delete(next()) + store.Delete(next()) } }) }) @@ -500,16 +500,16 @@ func randomPairs[V any](s []V) func() (V, V) { } func BenchmarkAll(b *testing.B) { - for bench := range createTestStores(slices.Values(benchStoreConfigs)) { - b.Run(bench.name, func(b *testing.B) { + for store := range createTestStores(slices.Values(benchStoreConfigs)) { + b.Run(store.name, func(b *testing.B) { b.Run("op=init", func(b *testing.B) { for b.Loop() { - bench.store.Range(forwardAll) + store.Range(forwardAll) } }) b.Run("op=full", func(b *testing.B) { for b.Loop() { - for k, v := range bench.store.Range(forwardAll) { + for k, v := range store.Range(forwardAll) { _, _ = k, v } } @@ -520,38 +520,38 @@ func BenchmarkAll(b *testing.B) { //nolint:gocognit func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { - for bench := range createTestStores(slices.Values(benchStoreConfigs)) { - b.Run(bench.name, func(b *testing.B) { - keys := boundKeys(bench.config.ref) + for store := range createTestStores(slices.Values(benchStoreConfigs)) { + b.Run(store.name, func(b *testing.B) { + keys := boundKeys(store.config.ref) b.Run("op=init", func(b *testing.B) { next := randomPairs(keys) for b.Loop() { low, high := next() - bench.store.Range(bounds(low, high)) + store.Range(bounds(low, high)) } }) b.Run("op=full", func(b *testing.B) { - if d, ok := bench.store.(dirtyable); ok { + if d, ok := store.ByteStore.(dirtyable); ok { d.refresh() } next := randomPairs(keys) for b.Loop() { low, high := next() - for k, v := range bench.store.Range(bounds(low, high)) { + for k, v := range store.Range(bounds(low, high)) { _, _ = k, v } } }) b.Run("op=full-dirty", func(b *testing.B) { - d, ok := bench.store.(dirtyable) + d, ok := store.ByteStore.(dirtyable) if !ok { - b.Skipf("skipping store of type %T", bench.store) + b.Skipf("skipping store of type %T", store.ByteStore) } next := randomPairs(keys) for b.Loop() { low, high := next() d.makeDirty() - for k, v := range bench.store.Range(bounds(low, high)) { + for k, v := range store.Range(bounds(low, high)) { _, _ = k, v } } diff --git a/fuzz_test.go b/fuzz_test.go index 7bc6bc5..e01ba1a 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -77,7 +77,7 @@ func FuzzGet(f *testing.F) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) for _, fuzz := range fuzzStores { expected, expectedOk := fuzz.config.ref.Get(key) - actual, actualOk := fuzz.store.Get(key) + actual, actualOk := fuzz.Get(key) assert.Equal(t, expectedOk, actualOk, "%s: %s", fuzz.def.name, kv.KeyName(key)) assert.Equal(t, expected, actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) } @@ -94,10 +94,10 @@ func FuzzSet(f *testing.F) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) expected, expectedOk := ref.Set(key, value) for _, fuzz := range fuzzStores { - actual, actualOk := fuzz.store.Set(key, value) + actual, actualOk := fuzz.Set(key, value) assert.Equal(t, expectedOk, actualOk, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) assert.Equal(t, expected, actual, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) - actual, ok := fuzz.store.Get(key) + actual, ok := fuzz.Get(key) assert.True(t, ok, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) assert.Equal(t, value, actual, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) } @@ -114,10 +114,10 @@ func FuzzDelete(f *testing.F) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) expected, expectedOk := ref.Delete(key) for _, fuzz := range fuzzStores { - actual, actualOk := fuzz.store.Delete(key) + actual, actualOk := fuzz.Delete(key) assert.Equal(t, expectedOk, actualOk, "%s: %s", fuzz.def.name, kv.KeyName(key)) assert.Equal(t, expected, actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) - actual, ok := fuzz.store.Get(key) + actual, ok := fuzz.Get(key) assert.False(t, ok, "%s: %s", fuzz.def.name, kv.KeyName(key)) assert.Equal(t, byte(0), actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) } @@ -138,9 +138,9 @@ func FuzzRange(f *testing.F) { forward := From(begin).To(end) reverse := From(end).DownTo(begin) for _, fuzz := range fuzzStores { - assertItersEqual(t, fuzz.config.ref.Range(forward), fuzz.store.Range(forward), + assertItersEqual(t, fuzz.config.ref.Range(forward), fuzz.Range(forward), "%s: %s", fuzz.def.name, forward) - assertItersEqual(t, fuzz.config.ref.Range(reverse), fuzz.store.Range(reverse), + assertItersEqual(t, fuzz.config.ref.Range(reverse), fuzz.Range(reverse), "%s: %s", fuzz.def.name, reverse) } }) @@ -156,10 +156,10 @@ func FuzzMixed(f *testing.F) { key := keyForFuzzInputs(fuzzSetKey, fuzzSetKeyLen) expected, expectedOk := ref.Set(key, value) for _, fuzz := range fuzzStores { - actual, actualOk := fuzz.store.Set(key, value) + actual, actualOk := fuzz.Set(key, value) assert.Equal(t, expectedOk, actualOk, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) assert.Equal(t, expected, actual, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) - actual, ok := fuzz.store.Get(key) + actual, ok := fuzz.Get(key) assert.True(t, ok, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) assert.Equal(t, value, actual, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) } @@ -167,10 +167,10 @@ func FuzzMixed(f *testing.F) { key = keyForFuzzInputs(fuzzDeleteKey, fuzzDeleteKeyLen) expected, expectedOk = ref.Delete(key) for _, fuzz := range fuzzStores { - actual, actualOk := fuzz.store.Delete(key) + actual, actualOk := fuzz.Delete(key) assert.Equal(t, expectedOk, actualOk, "%s: %s", fuzz.def.name, kv.KeyName(key)) assert.Equal(t, expected, actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) - actual, ok := fuzz.store.Get(key) + actual, ok := fuzz.Get(key) assert.False(t, ok, "%s: %s", fuzz.def.name, kv.KeyName(key)) assert.Equal(t, byte(0), actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) } diff --git a/kv_test.go b/kv_test.go index a73b0c2..6f98b1e 100644 --- a/kv_test.go +++ b/kv_test.go @@ -33,7 +33,7 @@ type ( // A description of a store to be tested or benchmarked. // Some fields may not be populated depending on the use case. // - // For benchmarking, there is one storeConfig with a given size used by all benchmarks, + // For benchmarking, there is one storeConfig for each corpus used by all benchmarks, // shared by all store implementations. storeConfig struct { name string @@ -41,13 +41,12 @@ type ( ref *reference } - // A store created by a def.factory(), possibly with entries from config. - // For some tests, an empty store might be created and config might be nil. - testStore struct { + // A named store created by [storeUnderTest.def], with entries from [storeUnderTest.config]. + storeUnderTest struct { name string - store ByteStore def *implDef config *storeConfig + ByteStore } ) @@ -161,12 +160,12 @@ func TestPrevKey(t *testing.T) { } // Recreates s.store. -func (s *testStore) resetFromConfig() { +func (s *storeUnderTest) resetFromConfig() { store := s.def.factory() for k, v := range s.config.ref.Asc(nil, nil) { store.Set([]byte(k), v) } - s.store = store + s.ByteStore = store } // Returns an iterator over the keys of itr. @@ -345,15 +344,15 @@ func createTestStoreConfigs() iter.Seq[*storeConfig] { } } -func createTestStores(storeConfigs iter.Seq[*storeConfig]) iter.Seq[*testStore] { - return func(yield func(*testStore) bool) { +func createTestStores(storeConfigs iter.Seq[*storeConfig]) iter.Seq[*storeUnderTest] { + return func(yield func(*storeUnderTest) bool) { for config := range storeConfigs { for _, def := range implDefs { store := def.factory() for k, v := range config.ref.All() { store.Set(k, v) } - if !yield(&testStore{config.name + "/" + def.name, store, def, config}) { + if !yield(&storeUnderTest{config.name + "/" + def.name, def, config, store}) { return } } @@ -599,41 +598,41 @@ func assertEarlyYield(t *testing.T, itr iter.Seq2[[]byte, byte]) { func TestStores(t *testing.T) { t.Parallel() - for test := range createTestStores(createTestStoreConfigs()) { - t.Run(test.name, func(t *testing.T) { + for store := range createTestStores(createTestStoreConfigs()) { + t.Run(store.name, func(t *testing.T) { t.Parallel() // Build the store, testing along the way. - store := test.def.factory() + s := store.def.factory() ref := newReference() - for k, v := range test.config.ref.All() { + for k, v := range store.config.ref.All() { t.Run("op=set/key="+kv.KeyName(k), func(t *testing.T) { - assertAbsent(t, k, store) - assertSame(t, ref, store) + assertAbsent(t, k, s) + assertSame(t, ref, s) - actual, ok := store.Set(k, v) + actual, ok := s.Set(k, v) assert.False(t, ok) assert.Equal(t, zero, actual) ref.Set(k, v) - assertSame(t, ref, store) + assertSame(t, ref, s) }) } - for k := range absentKeys(test.config.ref) { + for k := range absentKeys(store.config.ref) { t.Run("op=absent/key="+kv.KeyName(k), func(t *testing.T) { - assertAbsent(t, k, store) + assertAbsent(t, k, s) }) } t.Run("op=range", func(t *testing.T) { - for low, high := range rangePairs(boundKeys(test.config.ref)) { + for low, high := range rangePairs(boundKeys(store.config.ref)) { forward := From(low).To(high) reverse := From(high).DownTo(low) - assertItersEqual(t, test.config.ref.Range(forward), store.Range(forward), "%s", forward) - assertItersEqual(t, test.config.ref.Range(reverse), store.Range(reverse), "%s", reverse) + assertItersEqual(t, store.config.ref.Range(forward), s.Range(forward), "%s", forward) + assertItersEqual(t, store.config.ref.Range(reverse), s.Range(reverse), "%s", reverse) } - assertEarlyYield(t, store.Range(forwardAll)) - assertEarlyYield(t, store.Range(reverseAll)) + assertEarlyYield(t, s.Range(forwardAll)) + assertEarlyYield(t, s.Range(reverseAll)) }) }) } From 4c07a56f9f79f5c3fbdb3ecc6ac1b71496621420 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:29:07 -0700 Subject: [PATCH 22/30] Remove benchmarks for Sparse and Dense. These will be covered by benchmarking different corpuses later. --- bench_test.go | 71 ---------------- benchmarks/Dense.txt | 186 ------------------------------------------ benchmarks/Sparse.txt | 66 --------------- 3 files changed, 323 deletions(-) delete mode 100644 benchmarks/Dense.txt delete mode 100644 benchmarks/Sparse.txt diff --git a/bench_test.go b/bench_test.go index b6dd81a..15fe98d 100644 --- a/bench_test.go +++ b/bench_test.go @@ -66,12 +66,6 @@ func randomKey(meanLen int, random *rand.Rand) []byte { return randomBytes(int(math.Round(val)), random) } -func shuffle[S ~[]E, E any](slice S, random *rand.Rand) { - random.Shuffle(len(slice), func(i, j int) { - slice[i], slice[j] = slice[j], slice[i] - }) -} - // Returns a function which repeatedly loops over the elements of itr, // invoking reset after every full iteration. func repeat[V any](s []V, reset func()) func() V { @@ -349,71 +343,6 @@ func BenchmarkCreate(b *testing.B) { } } -// This benchmark is for memory allocations, not time. -// Creates one store and sets many keys per benchmark iteration. -func BenchmarkSparse(b *testing.B) { - random := rand.New(rand.NewPCG(12337405, 432843980)) - var keys keySet - for k := range 1 << 8 { - keyByte := byte(k) - keys = append(keys, []byte{keyByte, keyByte, keyByte, keyByte}) - } - shuffle(keys, random) - for _, def := range implDefs { - b.Run(def.name, func(b *testing.B) { - for b.Loop() { - store := def.factory() - for _, k := range keys { - store.Set(k, 0) - } - } - }) - } -} - -// This benchmark is for memory allocations, not time. -// Creates one store and sets many keys per benchmark iteration. -func BenchmarkDense(b *testing.B) { - random := rand.New(rand.NewPCG(9321075532, 1293487543289)) - oneKeys := make(keySet, 1<<8) - twoKeys := make(keySet, 1<<16) - threeKeys := make(keySet, 1<<24) - for k := range 1 << 8 { - oneKeys[k] = []byte{byte(k)} - } - for k := range 1 << 16 { - keyBytes := binary.LittleEndian.AppendUint16(nil, uint16(k)) - twoKeys[k] = []byte{keyBytes[0], keyBytes[1]} - } - for k := range 1 << 24 { - keyBytes := binary.LittleEndian.AppendUint32(nil, uint32(k)) - threeKeys[k] = []byte{keyBytes[0], keyBytes[1], keyBytes[2]} - } - shuffle(oneKeys, random) - shuffle(twoKeys, random) - shuffle(threeKeys, random) - keySets := []keySet{oneKeys, twoKeys, threeKeys} - for _, def := range implDefs { - for _, tt := range []struct { - name string - keys keySet - }{ - {"/keyLen=1", keySets[0]}, - {"/keyLen=2", keySets[1]}, - {"/keyLen=3", keySets[2]}, - } { - b.Run(def.name+tt.name, func(b *testing.B) { - for b.Loop() { - store := def.factory() - for _, k := range tt.keys { - store.Set(k, 0) - } - } - }) - } - } -} - func BenchmarkGet(b *testing.B) { for store := range createTestStores(slices.Values(benchStoreConfigs)) { b.Run(store.name, func(b *testing.B) { diff --git a/benchmarks/Dense.txt b/benchmarks/Dense.txt deleted file mode 100644 index 011c77e..0000000 --- a/benchmarks/Dense.txt +++ /dev/null @@ -1,186 +0,0 @@ -goos: darwin -goarch: arm64 -pkg: github.com/phiryll/kv -cpu: Apple M1 Max -BenchmarkDense/impl=reference/keyLen=1-10 57933 22119 ns/op 22768 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 57744 22342 ns/op 22768 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56973 22286 ns/op 22767 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 57235 22665 ns/op 22768 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56470 22527 ns/op 22768 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56692 22279 ns/op 22764 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 58006 22603 ns/op 22768 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56671 22266 ns/op 22769 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 57547 22272 ns/op 22767 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 57154 22395 ns/op 22764 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56433 22552 ns/op 22766 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56385 22660 ns/op 22768 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56973 22542 ns/op 22765 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56817 22412 ns/op 22768 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 58254 22323 ns/op 22769 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56996 23008 ns/op 22765 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 57412 22269 ns/op 22766 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56662 22343 ns/op 22767 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 56660 22425 ns/op 22767 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=1-10 57794 22752 ns/op 22766 B/op 18 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 183 6975149 ns/op 5808380 B/op 67743 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 183 6898001 ns/op 5807620 B/op 67738 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6895746 ns/op 5809017 B/op 67747 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6832976 ns/op 5808290 B/op 67742 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 183 6854020 ns/op 5807672 B/op 67738 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 187 6785559 ns/op 5808035 B/op 67741 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 180 6836328 ns/op 5807616 B/op 67738 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6842594 ns/op 5807739 B/op 67739 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 7000182 ns/op 5807179 B/op 67735 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6988084 ns/op 5807677 B/op 67738 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 183 6879758 ns/op 5807834 B/op 67739 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6860602 ns/op 5807838 B/op 67739 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6881624 ns/op 5807898 B/op 67740 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6906834 ns/op 5807685 B/op 67738 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6876913 ns/op 5808280 B/op 67742 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6902111 ns/op 5807575 B/op 67738 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6915480 ns/op 5807813 B/op 67739 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6867929 ns/op 5808122 B/op 67741 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 182 6852970 ns/op 5807838 B/op 67739 allocs/op -BenchmarkDense/impl=reference/keyLen=2-10 187 6783564 ns/op 5808942 B/op 67746 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4851658041 ns/op 1506543568 B/op 17390125 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4801756375 ns/op 1506844880 B/op 17392008 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4816186292 ns/op 1506752080 B/op 17391428 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4788668750 ns/op 1506810944 B/op 17391796 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4787363250 ns/op 1506734128 B/op 17391316 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4802899542 ns/op 1506636560 B/op 17390706 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4828796625 ns/op 1506523088 B/op 17389997 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4813621459 ns/op 1506646000 B/op 17390765 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4829534833 ns/op 1506561984 B/op 17390240 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4829764541 ns/op 1506729856 B/op 17391289 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4794690042 ns/op 1506670464 B/op 17390918 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4793120500 ns/op 1506612384 B/op 17390555 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4809716583 ns/op 1506721024 B/op 17391234 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4816571125 ns/op 1506723904 B/op 17391252 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4796393625 ns/op 1506517040 B/op 17389959 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4802695292 ns/op 1506754640 B/op 17391444 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4822267584 ns/op 1506693504 B/op 17391062 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4838730208 ns/op 1506558480 B/op 17390218 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4842397250 ns/op 1506662800 B/op 17390870 allocs/op -BenchmarkDense/impl=reference/keyLen=3-10 1 4829482125 ns/op 1506508400 B/op 17389905 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 101132 14234 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99735 14348 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99934 14460 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 100124 14413 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 100472 14381 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99313 14542 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99472 14430 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99811 14386 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 101084 14322 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 100827 14460 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 100035 14572 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99964 14479 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 100206 14531 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99303 14382 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 100053 14262 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99696 14530 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99675 14335 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 100576 14756 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99789 14453 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=1-10 99481 14577 ns/op 12696 B/op 266 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 122 9547213 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 123 9536752 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 123 9536103 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 122 9644637 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 123 9579746 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 122 9578025 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 122 9608961 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 122 9545034 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 123 9538332 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 123 9540871 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 123 9609115 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 123 9522994 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 122 9563567 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 122 9599119 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 100 10071914 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 120 9752353 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 120 9532230 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 122 9604994 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 122 9596076 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=2-10 123 9576680 ns/op 3254680 B/op 68106 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13960444583 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13920018792 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13881932375 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 14040514334 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13902305875 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13873915959 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13821890041 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13875785000 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13910139708 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13935102084 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13864924333 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13872687417 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13865733667 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13895090625 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13875432834 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13839368125 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13913322833 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13848465833 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13865446833 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=pointer-trie/keyLen=3-10 1 13773158750 ns/op 833202584 B/op 17435146 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 209006 6978 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208132 6830 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 209049 6550 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208543 6584 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208504 6578 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208644 6611 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208680 6636 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208377 6686 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208611 6580 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208501 6596 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208515 6628 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208671 6596 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208042 6578 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208435 6632 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208585 6569 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208366 6610 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208368 6618 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 204934 6578 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208446 6662 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=1-10 208497 6578 ns/op 6416 B/op 258 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 648 2151425 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 658 2124708 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 657 2132232 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 585 2240481 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 664 2116443 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 655 2160993 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 656 2155778 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 657 2163752 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 662 2177379 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 658 2158078 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 655 2211997 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 660 2147232 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 657 2229504 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 622 2210451 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 654 2146105 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 654 2141904 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 661 2170368 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 657 2169253 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 658 2185887 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=2-10 657 2155583 ns/op 1644816 B/op 66050 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 2027702167 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 2001581750 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1997261584 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1998817125 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 2001910084 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1997466041 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 2020366417 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 2004958417 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1995900625 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1997821584 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1994993250 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1993252167 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 2005497750 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1996483584 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1995617875 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 2003677334 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1992786292 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1995378542 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 2013782375 ns/op 421075216 B/op 16908802 allocs/op -BenchmarkDense/impl=array-trie/keyLen=3-10 1 1999180375 ns/op 421075216 B/op 16908802 allocs/op -PASS -ok github.com/phiryll/kv 944.788s diff --git a/benchmarks/Sparse.txt b/benchmarks/Sparse.txt deleted file mode 100644 index 582c590..0000000 --- a/benchmarks/Sparse.txt +++ /dev/null @@ -1,66 +0,0 @@ -goos: darwin -goarch: arm64 -pkg: github.com/phiryll/kv -cpu: Apple M1 Max -BenchmarkSparse/impl=reference-10 53515 23397 ns/op 23791 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 53113 23447 ns/op 23789 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51804 23445 ns/op 23790 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51658 23336 ns/op 23790 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 52142 23349 ns/op 23790 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51786 23375 ns/op 23788 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51732 23384 ns/op 23790 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51800 23514 ns/op 23793 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51518 23640 ns/op 23791 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51900 23369 ns/op 23793 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 52243 23335 ns/op 23790 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51872 23325 ns/op 23793 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51800 23532 ns/op 23793 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 52562 23246 ns/op 23792 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51862 23202 ns/op 23790 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 52189 23402 ns/op 23792 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51843 23332 ns/op 23792 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 51986 23194 ns/op 23793 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 52017 23378 ns/op 23790 B/op 274 allocs/op -BenchmarkSparse/impl=reference-10 52243 23323 ns/op 23789 B/op 274 allocs/op -BenchmarkSparse/impl=pointer-trie-10 20834 54685 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 21502 54185 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 22728 53005 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 22749 52163 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 22684 51844 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 23094 52567 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 22790 52675 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 22807 52260 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 22818 51805 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 23083 52367 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 23166 52034 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 22810 51147 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 23065 52143 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 23116 51582 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 23138 52446 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 22988 51598 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 23041 52170 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 23011 51861 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 23100 52375 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=pointer-trie-10 22992 52433 ns/op 43416 B/op 1802 allocs/op -BenchmarkSparse/impl=array-trie-10 5900 294217 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5923 281081 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5893 290078 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5770 293199 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5892 282283 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5896 287686 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5882 282932 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5894 278566 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5763 281378 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5900 268805 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5877 259194 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5838 256870 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5833 259071 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5902 259753 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5848 259920 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5877 257568 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5862 258747 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5898 257279 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5922 257945 ns/op 1788176 B/op 1794 allocs/op -BenchmarkSparse/impl=array-trie-10 5872 256744 ns/op 1788176 B/op 1794 allocs/op -PASS -ok github.com/phiryll/kv 357.496s From bd5c2477055d1df86dd7f29999a15bdb1b3c34c6 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:32:32 -0700 Subject: [PATCH 23/30] Remove obsolete benchmark results. --- benchmarks/Clone.txt | 246 ------------------- benchmarks/LongRange.txt | 486 ------------------------------------- benchmarks/RandomRange.txt | 486 ------------------------------------- benchmarks/ShortRange.txt | 486 ------------------------------------- 4 files changed, 1704 deletions(-) delete mode 100644 benchmarks/Clone.txt delete mode 100644 benchmarks/LongRange.txt delete mode 100644 benchmarks/RandomRange.txt delete mode 100644 benchmarks/ShortRange.txt diff --git a/benchmarks/Clone.txt b/benchmarks/Clone.txt deleted file mode 100644 index e8ebc0f..0000000 --- a/benchmarks/Clone.txt +++ /dev/null @@ -1,246 +0,0 @@ -goos: darwin -goarch: arm64 -pkg: github.com/phiryll/kv -cpu: Apple M1 Max -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1230 970179 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1465 900456 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1456 875094 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1460 863255 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1465 873609 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1466 865675 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1466 870565 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1468 867481 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1426 862462 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1470 863937 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1466 865094 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1464 867310 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1468 870291 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1465 879333 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1466 868683 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1458 867423 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1465 873697 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1464 868042 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1462 869414 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=65536-10 1467 881576 ns/op 2646096 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 349 3466480 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 360 3534431 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 352 3522071 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 345 3526181 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 361 3518748 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 363 3515334 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 363 3482536 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 360 3513980 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 363 3507186 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 363 3461162 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 357 3513750 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 363 3472890 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 361 3523459 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 363 3523448 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 363 3468926 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 362 3521958 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 362 3574277 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 361 3529969 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 363 3534254 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=262144-10 364 3526211 ns/op 10584144 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 87 13933947 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13982307 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13930277 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13926548 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13960118 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13937611 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13918300 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13956141 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13944291 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13925467 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 13933631 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 14040883 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 14148678 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 88 14081618 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 87 14110360 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 88 14076616 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 87 14104103 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 90 14193795 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 88 14077400 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=random/size=1048576-10 88 14098871 ns/op 42336336 B/op 4 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 262 4779045 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 261 4752671 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4685197 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 266 4683558 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4685740 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4683967 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4685753 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4682428 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4713952 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 266 4686954 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4690025 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 266 4688783 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 266 4690396 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4678417 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4709963 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4684963 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 266 4683636 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4693073 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4697002 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=reference/corpus=words/size=370104-10 265 4690030 ns/op 11181104 B/op 3735 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 52 22497574 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 52 22511298 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22594599 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22653743 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22656998 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22650176 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22732373 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22673802 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22645907 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22652594 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22637639 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22657949 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22641177 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22645605 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22794212 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22642298 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22644322 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22677265 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 52 22649939 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=65536-10 51 22659841 ns/op 17406432 B/op 803950 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102634821 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101826154 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101247146 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101534683 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101961121 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102861629 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102343858 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101911325 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102068942 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102557983 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102037533 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102541312 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102116950 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101881388 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102164383 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 102047004 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101907483 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101956125 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101404883 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=262144-10 10 101704350 ns/op 65571488 B/op 3010696 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 481365597 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 484946708 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 482730458 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 482212986 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 483031236 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 487469542 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 483576500 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 483287430 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 2 500464500 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 484544083 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 483857264 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 485187806 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 485961667 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 484165458 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 490915431 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 481252403 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 494235097 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 494086472 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 495780639 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=random/size=1048576-10 3 494821069 ns/op 253413208 B/op 11609097 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 13 80588484 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 13 82148865 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 14 80154265 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 13 80347885 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 13 80382676 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 13 80972042 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 13 80060792 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 77505028 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 75311783 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 75530836 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 14 74985631 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 75821711 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 75443553 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 75376517 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 75793461 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 76507903 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 76085406 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 75468439 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 15 75531528 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=pointer-trie/corpus=words/size=370104-10 13 77606516 ns/op 41191024 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 192333042 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 169849089 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 167858083 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 167945393 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 167788363 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 172412619 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 172236786 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 172401393 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 171657423 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 172892393 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 172857036 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 172795750 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 172703321 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 173314137 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 173393262 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 173138589 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 173437060 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 173074232 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 169523214 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=65536-10 7 169131560 ns/op 857743808 B/op 803950 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 640723770 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 646936042 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 641411688 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 641193271 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 643837854 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 644262354 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 645140312 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 645114666 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 644407500 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 644782834 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 645090000 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 646197084 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 647803271 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 649985812 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 647719438 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 648936584 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 647092062 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 648713312 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 646435916 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=262144-10 2 647508896 ns/op 3193356608 B/op 3010696 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2809090208 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2532854250 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2428669792 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2430050916 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2432817291 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2436605541 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2428544583 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2437228416 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2430294917 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2436215625 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2433353584 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2437748292 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2436980958 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2438571958 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2444225292 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2476031666 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2435187250 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2436093292 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2435812792 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=random/size=1048576-10 1 2447854167 ns/op 12270801392 B/op 11609097 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 345217028 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 344751236 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 371672986 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 370417597 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 373905958 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 372667375 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 371933542 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 371750611 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 372649500 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 372995694 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 373429569 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 372351417 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 382870264 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 381626945 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 382656000 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 382128556 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 384037861 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 384880153 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 384856000 ns/op 1733468704 B/op 1773046 allocs/op -BenchmarkClone/impl=array-trie/corpus=words/size=370104-10 3 383085458 ns/op 1733468704 B/op 1773046 allocs/op -PASS -ok github.com/phiryll/kv 1857.492s diff --git a/benchmarks/LongRange.txt b/benchmarks/LongRange.txt deleted file mode 100644 index a67a314..0000000 --- a/benchmarks/LongRange.txt +++ /dev/null @@ -1,486 +0,0 @@ -goos: darwin -goarch: arm64 -pkg: github.com/phiryll/kv -cpu: Apple M1 Max -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 8330137 145.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7326962 163.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7362409 160.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7285526 163.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7025856 165.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7419082 160.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7477190 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7461067 160.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7429021 158.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7412535 161.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7445626 160.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7411989 160.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7464150 160.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7428022 160.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7462778 159.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7436430 160.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7427036 160.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7462594 160.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7444516 159.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7430144 160.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2343 507432 ns/op 536929 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2349 509348 ns/op 536929 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2344 508288 ns/op 536923 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2342 508462 ns/op 536941 B/op 21907 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2343 508182 ns/op 536929 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2337 508279 ns/op 536938 B/op 21907 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2337 508242 ns/op 536938 B/op 21907 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2334 508013 ns/op 536931 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2336 507845 ns/op 536936 B/op 21907 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2348 507987 ns/op 536922 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2318 508216 ns/op 537029 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2344 507940 ns/op 536923 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2349 508168 ns/op 536929 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2342 507293 ns/op 536941 B/op 21907 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2343 508560 ns/op 536929 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2338 507952 ns/op 536941 B/op 21907 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2336 507764 ns/op 536936 B/op 21907 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2342 508183 ns/op 536941 B/op 21907 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2310 507902 ns/op 536958 B/op 21907 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 2346 516289 ns/op 536916 B/op 21906 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7411728 160.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7407612 160.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7412888 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7412095 161.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7412764 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7422781 161.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7397374 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7407378 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7414195 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7372850 160.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7451500 160.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7388518 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7416446 161.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7420071 160.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7396825 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7417701 159.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7427271 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7415244 158.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7423737 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7411230 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2197 519455 ns/op 537030 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2232 519279 ns/op 537024 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2239 519516 ns/op 536997 B/op 21909 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2232 519466 ns/op 537024 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2241 520042 ns/op 537000 B/op 21909 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2239 519275 ns/op 536997 B/op 21909 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2226 519606 ns/op 537033 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2232 519414 ns/op 537024 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2245 521784 ns/op 536992 B/op 21909 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2232 519305 ns/op 537024 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2236 519688 ns/op 537003 B/op 21909 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2199 519571 ns/op 537027 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2236 519162 ns/op 537003 B/op 21909 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2238 519497 ns/op 536994 B/op 21909 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2233 518820 ns/op 537019 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2229 519195 ns/op 537028 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2232 519924 ns/op 537024 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2234 518861 ns/op 537022 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2211 519185 ns/op 536985 B/op 21909 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 2230 522093 ns/op 537022 B/op 21910 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7076208 162.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7025446 162.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7089262 162.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7066840 162.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7047085 162.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7068580 162.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7063120 158.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7056034 162.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7077496 162.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7062412 161.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7107009 160.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7033820 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7049151 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7092250 162.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7103166 162.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7107013 163.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7051582 162.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7032226 160.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7060269 162.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7039686 163.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1698506 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1700332 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1699544 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1699898 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1699539 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1699964 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1700401 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1697576 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 674 1697594 ns/op 2018770 B/op 82526 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1698829 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1699784 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 674 1698745 ns/op 2018770 B/op 82526 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1698398 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 674 1699423 ns/op 2018770 B/op 82526 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1700206 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1701990 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 673 1702248 ns/op 2018812 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 672 1702979 ns/op 2018815 B/op 82528 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 674 1699648 ns/op 2018770 B/op 82526 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 670 1701700 ns/op 2018796 B/op 82527 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7047670 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7041295 162.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7049274 163.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7048159 163.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7144684 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7011807 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7074204 162.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7027743 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7033732 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7042552 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7033080 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7017097 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 7067395 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6964154 165.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6978554 165.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6980571 165.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6929920 165.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6934350 165.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6949177 165.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6957223 165.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 668 1723741 ns/op 2018649 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 663 1719403 ns/op 2018346 B/op 82509 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 668 1722554 ns/op 2018649 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 670 1721703 ns/op 2018666 B/op 82522 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 661 1721024 ns/op 2018413 B/op 82512 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 670 1715297 ns/op 2018666 B/op 82522 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 670 1716286 ns/op 2018666 B/op 82522 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 669 1716753 ns/op 2018654 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 670 1718218 ns/op 2018666 B/op 82522 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 670 1716081 ns/op 2018666 B/op 82522 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 668 1717276 ns/op 2018649 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 669 1715694 ns/op 2018654 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 669 1715766 ns/op 2018654 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 669 1716739 ns/op 2018654 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 669 1716940 ns/op 2018654 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 669 1714681 ns/op 2018654 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 669 1714780 ns/op 2018654 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 669 1713481 ns/op 2018654 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 655 1741749 ns/op 2018543 B/op 82517 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 669 1715862 ns/op 2018654 B/op 82521 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7094498 161.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7096716 162.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7101308 161.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7118811 161.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7117407 160.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7102213 161.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7097050 161.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7101742 161.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7134462 161.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7120171 161.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7123963 160.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7126424 161.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7092498 161.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7115253 161.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7117154 161.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7128716 161.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7114166 161.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7110244 161.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7114570 161.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7125886 162.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6589877 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6592217 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 178 6594121 ns/op 7812452 B/op 319738 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6612760 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6599366 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6590846 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6594343 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6587134 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6595094 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6591607 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6594716 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6593132 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6588450 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6703801 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 176 6589592 ns/op 7811530 B/op 319701 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6595719 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6594440 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6588459 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6586664 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 180 6593262 ns/op 7811718 B/op 319708 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7088614 162.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7110002 161.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7112540 161.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7093778 161.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7093908 161.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7084524 162.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7065633 161.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7101112 161.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7116348 161.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7128920 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7127251 160.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7123300 161.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7090021 161.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7085065 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7103682 161.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7158403 176.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7094137 161.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6964471 164.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7115677 161.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7121104 162.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6676144 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6673127 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6678466 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 175 6678646 ns/op 7811491 B/op 319699 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6677833 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6675607 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6673608 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6674343 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6674717 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 176 6784301 ns/op 7811137 B/op 319685 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6677712 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6679541 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6671510 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6672606 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6685247 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6680641 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6682329 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6678272 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6675751 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 177 6677079 ns/op 7811326 B/op 319693 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7199065 152.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7228764 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7217092 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7177417 158.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7235115 158.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7208401 158.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7192686 158.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7191032 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7018082 160.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7221750 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7218535 158.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7204639 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7222026 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7195466 158.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7229350 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7214650 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7219959 158.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7207018 158.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7213284 158.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7194429 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1558 691440 ns/op 536860 B/op 21903 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1544 692042 ns/op 536835 B/op 21902 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1543 692193 ns/op 536837 B/op 21903 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1542 698609 ns/op 536825 B/op 21902 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1538 691538 ns/op 536816 B/op 21902 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1542 698178 ns/op 536825 B/op 21902 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1544 695776 ns/op 536835 B/op 21902 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1542 691143 ns/op 536825 B/op 21902 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1556 698100 ns/op 536848 B/op 21903 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1558 705470 ns/op 536860 B/op 21903 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1528 698178 ns/op 536845 B/op 21903 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1555 690784 ns/op 536844 B/op 21903 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1556 697961 ns/op 536848 B/op 21903 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1544 690975 ns/op 536835 B/op 21902 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1546 691077 ns/op 536821 B/op 21902 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1542 692656 ns/op 536825 B/op 21902 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1552 691559 ns/op 536804 B/op 21901 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1549 698651 ns/op 536781 B/op 21900 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1558 690664 ns/op 536860 B/op 21903 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 1551 690940 ns/op 536808 B/op 21901 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7188885 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7199323 159.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7203612 158.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7174308 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7200926 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7201677 162.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7175133 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7195929 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7181862 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7216900 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7187367 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7202595 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7206949 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7196820 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7182168 158.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7195633 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7189462 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7202356 161.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7163581 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 7214679 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1042 1088064 ns/op 536982 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1036 1087701 ns/op 536915 B/op 21906 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1039 1087820 ns/op 536969 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1041 1089612 ns/op 536983 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1042 1090546 ns/op 536982 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1039 1090288 ns/op 536969 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1039 1089622 ns/op 536969 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1042 1089236 ns/op 536982 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1041 1090742 ns/op 536983 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1044 1098547 ns/op 536985 B/op 21909 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1039 1092710 ns/op 536969 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1039 1089700 ns/op 536969 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1040 1089046 ns/op 536975 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1039 1089072 ns/op 536969 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1041 1088629 ns/op 536983 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1039 1100435 ns/op 536969 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1032 1089231 ns/op 537001 B/op 21909 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1042 1087036 ns/op 536982 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1036 1089220 ns/op 536915 B/op 21906 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 1039 1087028 ns/op 536969 B/op 21908 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7174734 165.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7248895 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7201879 158.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7211601 158.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7212999 158.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7223158 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7238928 158.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7212007 158.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7238503 162.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7235307 158.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7198660 158.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7212796 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7198755 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7203860 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7126244 158.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7206314 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7195822 158.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7211538 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7227682 158.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7208602 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 451 2612346 ns/op 2019185 B/op 82543 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 450 2620768 ns/op 2019213 B/op 82544 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 445 2617876 ns/op 2018821 B/op 82528 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 450 2593434 ns/op 2019213 B/op 82544 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 448 2596423 ns/op 2019055 B/op 82538 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 450 2605249 ns/op 2019213 B/op 82544 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 450 2598109 ns/op 2019213 B/op 82544 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 450 2618779 ns/op 2019213 B/op 82544 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 440 2595134 ns/op 2018893 B/op 82531 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 450 2597644 ns/op 2019213 B/op 82544 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 450 2640478 ns/op 2019213 B/op 82544 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 442 2619025 ns/op 2018660 B/op 82522 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 450 2594355 ns/op 2019213 B/op 82544 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 448 2596760 ns/op 2019055 B/op 82538 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 448 2596359 ns/op 2019055 B/op 82538 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 451 2605001 ns/op 2019185 B/op 82543 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 448 2623393 ns/op 2019055 B/op 82538 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 451 2595601 ns/op 2019185 B/op 82543 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 447 2591906 ns/op 2019195 B/op 82544 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 451 2595350 ns/op 2019185 B/op 82543 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7183658 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7163895 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7189491 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7205428 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7189240 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7175847 158.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7201760 158.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7179038 161.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7195022 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7200594 161.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7188229 160.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7183909 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7183317 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7178152 159.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7192238 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7139227 162.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7194100 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7173740 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7186714 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 7198604 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4035864 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4030554 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4030211 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 292 4027063 ns/op 2018178 B/op 82502 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4034318 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4032949 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4040129 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4035432 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4033605 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4025663 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4036351 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 292 4038227 ns/op 2018178 B/op 82502 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4037202 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4030802 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4036663 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4030642 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4033463 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4036049 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 292 4028587 ns/op 2018178 B/op 82502 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 294 4031275 ns/op 2018115 B/op 82500 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7319584 157.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7221864 157.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7205160 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7202836 158.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7221280 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7213042 161.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7198156 158.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7204363 158.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7218806 162.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7203411 158.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7201231 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7196248 158.2 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7183084 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7214137 158.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7083846 160.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7225882 158.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7204462 158.7 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7214421 160.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7212499 160.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7192244 158.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 117 10097613 ns/op 7810193 B/op 319646 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 118 9919777 ns/op 7810748 B/op 319668 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 118 9954660 ns/op 7810748 B/op 319668 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 120 9919580 ns/op 7810117 B/op 319642 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 120 9924955 ns/op 7810117 B/op 319642 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 120 10117618 ns/op 7810117 B/op 319642 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 120 10020705 ns/op 7810117 B/op 319642 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 120 10082535 ns/op 7810117 B/op 319642 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 116 10094343 ns/op 7810721 B/op 319667 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 117 10108182 ns/op 7810192 B/op 319646 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 116 10098097 ns/op 7810721 B/op 319667 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 116 10104460 ns/op 7810721 B/op 319667 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 117 10069316 ns/op 7810192 B/op 319646 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 116 10118790 ns/op 7810721 B/op 319667 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 117 10088047 ns/op 7810192 B/op 319646 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 116 10093398 ns/op 7810721 B/op 319667 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 116 10114896 ns/op 7810721 B/op 319667 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 116 10087713 ns/op 7810721 B/op 319667 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 117 10105025 ns/op 7810193 B/op 319646 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 117 10138373 ns/op 7810193 B/op 319646 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7098356 161.8 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7191538 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7174797 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7191561 158.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7204239 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7181193 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7210096 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7176672 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7189086 158.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7196252 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7173852 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7092070 161.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7171404 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7199888 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7187031 161.9 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7189327 159.0 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7204466 162.5 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7154436 160.4 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7194283 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 7189302 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15633156 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15613502 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15624282 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15849734 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15663766 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15662452 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15620535 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15614344 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15619776 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15609917 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 74 15831898 ns/op 7809932 B/op 319636 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 74 15774555 ns/op 7809932 B/op 319636 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15839341 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 74 15802565 ns/op 7809932 B/op 319636 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15853120 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 74 15810157 ns/op 7809932 B/op 319636 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 75 15796870 ns/op 7811352 B/op 319694 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 74 15790931 ns/op 7809932 B/op 319636 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 74 15793655 ns/op 7809932 B/op 319636 allocs/op -BenchmarkLongRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 74 15786292 ns/op 7809932 B/op 319636 allocs/op -PASS -ok github.com/phiryll/kv 3899.173s diff --git a/benchmarks/RandomRange.txt b/benchmarks/RandomRange.txt deleted file mode 100644 index 395998e..0000000 --- a/benchmarks/RandomRange.txt +++ /dev/null @@ -1,486 +0,0 @@ -goos: darwin -goarch: arm64 -pkg: github.com/phiryll/kv -cpu: Apple M1 Max -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7121960 171.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6470250 186.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6440150 186.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6383502 186.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6439034 186.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6409821 187.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6437468 186.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6256825 184.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6420837 185.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6432097 185.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6435472 185.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6442502 185.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6448454 184.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6427249 184.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6411282 185.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6427120 185.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6417940 184.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6431401 185.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6424810 185.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 6433868 185.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 20004114 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 20086745 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19869379 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19886578 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19881030 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19871057 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19891761 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19880182 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19877377 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 86 19637557 ns/op 22062603 B/op 900115 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 86 19652887 ns/op 22062603 B/op 900115 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19870224 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 85 20044001 ns/op 22235482 B/op 907169 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 85 19757309 ns/op 22235482 B/op 907169 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19882114 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19871666 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19883056 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19919769 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19855368 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 87 19864131 ns/op 22265926 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6405088 185.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6384373 185.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6389002 185.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6414685 185.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6410820 185.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6366046 186.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6425851 186.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6401422 186.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6410919 185.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6419706 186.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6397086 186.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6416858 186.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6398968 185.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6405499 186.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6369636 185.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6399888 185.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6381564 186.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6360805 186.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6407262 185.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6380109 185.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20234887 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20255643 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20234730 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20236101 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20230556 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 86 19999749 ns/op 22062614 B/op 900116 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20225694 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 86 19975385 ns/op 22062614 B/op 900116 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20207655 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20255268 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20210158 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 86 19969005 ns/op 22062614 B/op 900116 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20216711 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20235449 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 86 19974265 ns/op 22062614 B/op 900116 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20187756 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20215526 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 86 19968922 ns/op 22062614 B/op 900116 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20221260 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 87 20241911 ns/op 22265938 B/op 908411 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6136501 186.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6136628 188.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6152409 187.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6151310 187.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6163603 187.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6151296 187.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6144237 189.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6122715 187.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6151344 189.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6157285 187.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6155905 188.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6169041 188.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6160425 187.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6160938 187.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6144248 188.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6166748 185.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6111637 187.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6156481 184.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6151204 187.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6202126 187.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71719237 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71675737 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71760109 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71700523 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71830076 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71645711 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71921690 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71700633 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71638198 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 14 71983679 ns/op 82996924 B/op 3392906 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71790846 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71863833 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71774289 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71733365 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71813818 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71657927 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71751393 ns/op 84258443 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71783940 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71802003 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 16 71705073 ns/op 84258442 B/op 3444482 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6121826 187.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6120228 188.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6133881 189.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6118387 188.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6031206 187.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6154395 188.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6134059 187.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6139030 185.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6128752 188.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6127983 188.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6125072 188.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6125104 188.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6136531 188.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6127399 187.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6124581 188.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6115884 186.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6133399 188.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6106594 189.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6140592 188.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6128162 188.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72142232 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72161729 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72148148 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72190289 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72122487 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72539154 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72227464 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72299096 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72247258 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72339029 ns/op 84258473 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72166370 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72151271 ns/op 84258473 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72231076 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72225550 ns/op 84258473 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72168781 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72239076 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72165961 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 14 71530679 ns/op 82996960 B/op 3392908 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72228224 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 16 72195409 ns/op 84258472 B/op 3444483 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6083410 203.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6015744 186.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6198163 185.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6190437 186.6 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6201276 185.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6187104 186.3 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6077691 186.3 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6195438 186.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6201993 186.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6194721 186.0 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6179385 186.4 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6219482 186.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6219178 186.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6240526 185.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6188824 186.3 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6195056 186.2 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6197091 186.0 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6198866 186.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6195997 184.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6184514 186.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 484210722 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481647695 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481609903 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 488649125 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 482915042 ns/op 561226658 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481942653 ns/op 561226658 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 482210222 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 482539861 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 482015875 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481725208 ns/op 561226658 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 482053639 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 482028986 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481710500 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 484063055 ns/op 561226658 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481692181 ns/op 561226658 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481808528 ns/op 561226658 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481654819 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481697931 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 481388458 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 3 482922292 ns/op 561226653 B/op 22969189 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6194901 185.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6171397 186.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6189267 186.2 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6190651 186.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6169912 186.5 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6174780 187.0 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6191095 186.6 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6183855 186.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6193122 186.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6165969 186.7 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6186136 186.5 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6208590 186.2 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6174838 186.6 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6132540 188.5 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6201823 187.0 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6212871 186.7 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6173880 186.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6201919 186.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6165010 183.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6189897 186.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487150153 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 488255736 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487077014 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487894542 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487134611 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 492233819 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 488395347 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487670194 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487225333 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 488284194 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487402958 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487494653 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487302778 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487425945 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487526653 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487833445 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487935097 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487147972 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487399986 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 3 487158570 ns/op 561226690 B/op 22969191 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6235796 183.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6242581 183.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6269521 184.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6276834 183.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6296870 183.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6289266 184.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6298274 183.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6258530 187.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6266361 183.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6253521 183.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6283768 183.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6257296 183.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6279490 184.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6258310 183.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6279908 183.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6281426 183.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6257644 183.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6272314 184.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6277447 185.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 6245194 183.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 43 26349355 ns/op 20176662 B/op 823171 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 43 26798146 ns/op 20176662 B/op 823171 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26758632 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 43 26346813 ns/op 20176662 B/op 823171 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 43 26205913 ns/op 20176662 B/op 823171 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26225030 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26501454 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26214530 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 43 26205881 ns/op 20176662 B/op 823171 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26230798 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 43 26484085 ns/op 20176662 B/op 823171 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26331321 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26385824 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 43 26419936 ns/op 20176662 B/op 823171 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26458362 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26480177 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26335716 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26490617 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 43 26196034 ns/op 20176662 B/op 823171 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 42 26231749 ns/op 20205576 B/op 824350 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6136266 187.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6266830 185.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6227178 184.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6271059 183.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6228876 184.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6274048 184.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6269706 185.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6287575 184.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6245257 183.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6248547 184.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6250492 184.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6288908 184.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6262766 184.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6147674 184.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6267919 184.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6234109 183.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6265882 183.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6244312 184.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6252968 184.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6250665 184.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40750196 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40793114 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40799034 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40818021 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40857750 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40964883 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40757461 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40803060 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40786902 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40846876 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40856664 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40774403 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40719035 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40857727 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40745109 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40765392 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40802569 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40759019 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40764316 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 31 40813371 ns/op 20082406 B/op 819325 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6236061 184.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6293067 183.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6283890 183.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6251623 183.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6270345 183.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6284919 184.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6254575 183.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6290023 183.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6264483 183.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6270033 186.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6253090 185.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6241996 183.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6252450 187.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6268846 184.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6284098 184.1 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6155498 188.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6279140 183.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6261274 184.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6240879 183.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 6279988 183.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 123248403 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 121986468 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 123777139 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 123953042 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 124617880 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 124292565 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 124417315 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 123440440 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 124399750 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 123957324 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 123964861 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 124366903 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 124494097 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 124545023 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 124008069 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 124070653 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 122102602 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 122059681 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 122020269 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 9 123222690 ns/op 94109181 B/op 3847187 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6252284 187.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6249644 184.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6248318 183.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 5981916 184.0 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6239054 184.7 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6256842 184.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6242612 186.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6200461 184.2 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6238537 187.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6088765 188.5 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6154387 187.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6154741 187.8 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6142519 187.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6158674 189.9 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6050462 187.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6116760 187.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6135901 186.6 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6240406 184.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6244958 188.4 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6270723 184.3 ns/op 208 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194682451 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194606417 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194773271 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 195377298 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 196648972 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194332826 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194164576 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 196910556 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194205180 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194096702 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194263521 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194201903 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194526694 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194117320 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194186486 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194186125 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194438896 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 194399361 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 193710660 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 6 193953535 ns/op 97003658 B/op 3965482 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6391442 181.6 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6276073 182.2 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6301134 182.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6181892 186.4 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6300481 183.5 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6288156 183.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6287714 183.4 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6261466 183.0 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6295136 183.6 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6287462 183.5 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6296185 183.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6285500 183.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6174086 186.5 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6181435 186.4 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6177751 186.2 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6253387 186.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6156244 185.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6169401 184.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6296840 185.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6280377 183.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 534397146 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 532781354 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533902834 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533760770 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533171166 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 534432666 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 538587396 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533532688 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 532882438 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533516875 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533427666 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533281229 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533678980 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533989583 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 532628500 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 546278271 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 532723584 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533309479 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 533983271 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 2 539629104 ns/op 414609184 B/op 16968560 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6253826 183.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6250639 183.3 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6275727 184.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6233341 185.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6243000 184.0 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6294946 183.9 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6275359 184.4 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6267319 183.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6258273 184.0 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6281947 183.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6278724 185.2 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6264836 184.0 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6214356 184.1 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6205606 184.0 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6250545 184.4 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6261152 183.7 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6263606 183.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6237662 183.8 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6258008 184.2 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6282165 183.5 ns/op 207 B/op 7 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1013629416 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1014125000 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1015611791 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1014711458 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1015798416 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1023499542 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1033136541 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1014227875 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1015772000 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1013932750 ns/op 506325336 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1014396375 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1013021916 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1015692250 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1013995500 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1015675834 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1018035208 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1014352167 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1015329750 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1013686708 ns/op 506325320 B/op 20722183 allocs/op -BenchmarkRandomRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 1 1014848125 ns/op 506325320 B/op 20722183 allocs/op -PASS -ok github.com/phiryll/kv 4120.134s diff --git a/benchmarks/ShortRange.txt b/benchmarks/ShortRange.txt deleted file mode 100644 index 0f217cb..0000000 --- a/benchmarks/ShortRange.txt +++ /dev/null @@ -1,486 +0,0 @@ -goos: darwin -goarch: arm64 -pkg: github.com/phiryll/kv -cpu: Apple M1 Max -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 8427007 145.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7513626 163.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7470720 160.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7470793 162.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7435855 162.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7469746 162.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7419598 161.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7324221 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7467517 160.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7422812 158.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7462670 160.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7432587 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7459765 161.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7454499 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7414485 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7406744 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7457125 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7456050 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7443075 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=range-10 7467352 160.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 805026 1401 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 804776 1405 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 806877 1401 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 805564 1402 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 804178 1400 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 792824 1402 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 806866 1403 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 787754 1400 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 806828 1404 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 806367 1401 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 803058 1402 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 805990 1400 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 804255 1403 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 806721 1400 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 803145 1400 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 806718 1402 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 805780 1400 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 804082 1401 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 804915 1401 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=forward/op=full-10 805857 1400 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7241473 164.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7260098 164.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7259846 165.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7038646 167.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7248906 164.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7263603 164.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7249348 164.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7223361 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7183321 164.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7259142 164.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7234791 164.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7166191 164.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7269147 162.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7235180 167.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 6939890 166.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7151331 165.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7263510 164.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7236112 164.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7210110 164.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=range-10 7170556 168.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 722560 1593 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 742143 1601 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 739969 1592 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 707802 1590 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 724934 1597 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 709016 1598 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 728554 1584 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 699307 1586 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 741004 1524 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 737553 1599 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 742224 1524 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 744384 1530 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 741525 1525 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 744078 1533 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 741625 1526 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 712705 1526 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 673995 1559 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 741249 1529 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 738990 1527 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=65536/dir=reverse/op=full-10 742623 1525 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6910436 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6964411 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6951710 163.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6947611 163.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6925953 161.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6970730 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 7000014 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6941392 163.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6972018 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6938526 162.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6978669 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6990604 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6948036 163.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6931689 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6957741 163.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6987968 163.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6982710 163.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6962641 161.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6990204 163.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=range-10 6947905 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 414355 2881 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 414502 2881 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 414620 2881 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 414790 2882 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 404164 2970 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 400246 2974 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 398833 2953 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 398328 2982 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 399704 2974 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 403776 2971 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 399594 2973 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 398821 2978 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 400203 2979 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 402572 2953 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 402740 2967 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 399698 2978 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 399772 2974 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 415444 2885 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 415860 2881 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=forward/op=full-10 414165 2881 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6808492 167.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6785458 166.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6751785 167.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6805927 167.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6793675 164.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6774745 167.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6751027 167.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6786348 167.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6786962 167.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6791836 163.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6802774 171.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6815064 167.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6804998 167.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6767889 164.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6791762 167.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6797781 165.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6776239 162.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6788948 171.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6780211 168.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=range-10 6820084 167.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 390618 3062 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 390496 3064 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 391545 3170 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 391545 3074 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 390818 3064 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 390283 3061 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 390019 3072 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 390784 3070 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 389544 3061 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 391515 3074 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 391694 3049 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 391803 3045 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 390193 3052 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 392733 3053 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 392468 3049 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 392530 3051 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 392343 3047 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 392508 3046 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 392245 3057 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=262144/dir=reverse/op=full-10 392306 3053 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7013515 163.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7006777 162.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6994376 162.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7021242 162.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6935259 160.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7046996 161.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7023640 161.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7116078 162.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7033812 162.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7033526 162.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7015149 162.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7000069 162.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6999162 162.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7004526 162.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7001539 162.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7018670 162.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6980185 162.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7003372 162.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 6951324 162.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=range-10 7009975 162.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129364 8210 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129555 8197 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129760 8212 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 128169 8219 ns/op 8245 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129632 8209 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129534 8213 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129676 8205 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129559 8226 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129384 8211 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129456 8199 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129474 8215 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129703 8223 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129735 8210 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 127234 8207 ns/op 8245 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129345 8206 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129465 8214 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129775 8204 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129523 8200 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 129534 8205 ns/op 8244 B/op 337 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=forward/op=full-10 128047 8417 ns/op 8245 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6825957 166.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6830298 169.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6763936 166.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6842815 166.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6846952 166.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6822054 166.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6641438 166.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6824926 166.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6839804 166.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6782659 166.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6816649 166.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6816726 166.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6761936 165.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6848247 166.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6694482 169.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6768993 169.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6846680 169.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6648278 170.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6621502 169.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6627346 166.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 124995 8625 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 123519 8621 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 125221 8521 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127660 8438 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 125116 8436 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127374 8412 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127189 8475 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127238 8478 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 126128 8445 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127239 8443 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127177 8443 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127581 8457 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 125818 8443 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127136 8487 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127437 8414 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127431 8417 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127353 8412 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127602 8416 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127384 8399 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=pointer-trie/corpus=random/size=1048576/dir=reverse/op=full-10 127651 8414 ns/op 8251 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7063012 154.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7095920 161.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7094013 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7111297 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7103659 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7115257 160.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7090809 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7106952 159.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7096494 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7060591 160.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7101736 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7097948 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7099303 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7100647 159.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7082644 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7015897 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7113253 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7108176 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7108878 161.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=range-10 7118374 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 767426 1556 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 768402 1557 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 761883 1560 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 767434 1555 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 767302 1557 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 768300 1557 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 768734 1556 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 764679 1557 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 766839 1558 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 767731 1554 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 769954 1554 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 767974 1554 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 765854 1554 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 769638 1557 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 767511 1554 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 767098 1558 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 766924 1554 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 766686 1555 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 768691 1555 ns/op 1180 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=forward/op=full-10 766722 1560 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6897469 163.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6927274 163.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6901711 164.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6891164 165.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6915591 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6930385 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6905836 163.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6922954 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6926838 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6925855 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6885109 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6891789 163.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6696378 167.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6917268 167.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6479814 169.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6910957 164.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6901790 167.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6903561 164.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6925489 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=range-10 6930522 163.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 615816 1979 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 611475 1942 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 613381 1942 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 613390 1950 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 613544 1942 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 613981 1952 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 615837 1940 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 616118 1943 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 616196 1940 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 615769 1959 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 615436 1944 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 612956 1943 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 615518 1943 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 615884 1942 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 616153 1948 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 615304 1942 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 614116 1941 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 600318 1951 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 614664 1941 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=65536/dir=reverse/op=full-10 613879 1946 ns/op 1181 B/op 48 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7066934 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7104274 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7073059 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7081288 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7076946 160.9 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7091737 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7070869 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7070109 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7116272 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7104445 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7095734 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7112185 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7093027 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7106022 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7113878 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7103955 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7094565 161.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7108507 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7105448 159.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=range-10 7106385 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 309678 3847 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 310412 3849 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 311466 3849 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 311562 3848 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 310044 3853 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 310264 3859 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 311209 3849 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 310839 3859 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 311276 3850 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 311136 3847 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 307708 3852 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 311007 3850 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 311120 3863 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 310650 3853 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 310350 3856 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 310808 3851 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 310910 3860 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 311660 3894 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 309908 3848 ns/op 2664 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=forward/op=full-10 310726 3857 ns/op 2663 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6906603 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6905192 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6902200 163.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6917527 164.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6904146 163.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6910870 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6912610 163.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6916753 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6921274 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6918126 166.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6871906 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6933044 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6917025 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6915208 163.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6695749 166.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6917086 163.1 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6910684 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6915771 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6900356 163.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=range-10 6873475 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196256 5303 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196250 5300 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196684 5283 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 197241 5296 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196425 5298 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196405 5285 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 194379 5292 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196472 5281 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196610 5282 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196891 5294 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 197096 5275 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 195247 5396 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 194138 5294 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 195698 5289 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196375 5313 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196322 5279 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 197206 5278 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196638 5279 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196141 5297 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=262144/dir=reverse/op=full-10 196472 5279 ns/op 2662 B/op 109 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7183140 157.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7120875 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7079760 159.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7106066 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7101350 159.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7098169 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 6948180 159.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7071657 159.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7080799 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7068694 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7110554 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7111204 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7079222 159.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7073401 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7065854 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7082667 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7084116 159.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7109949 159.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7105978 159.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=range-10 7063724 159.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96940 11438 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 97129 11476 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96792 11446 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96764 11461 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 97083 11478 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96866 11437 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 97297 11473 ns/op 8240 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96906 11483 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 97292 11437 ns/op 8240 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96474 11483 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96826 11496 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 97208 11502 ns/op 8240 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96914 11544 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96938 11450 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 94897 11559 ns/op 8238 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 97162 11442 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96448 11441 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96204 11452 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96645 11447 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=forward/op=full-10 96867 11450 ns/op 8239 B/op 337 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6891493 164.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6850070 163.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6905607 166.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6888100 163.7 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6871341 164.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6910788 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6890456 164.0 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6912710 163.3 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6894896 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6757342 163.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6914464 164.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6897920 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6889646 167.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6905629 163.5 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6846138 163.4 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6891511 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6917608 163.8 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6908851 164.2 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6896150 163.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=range-10 6893878 167.6 ns/op 200 B/op 7 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68235 16913 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68215 16936 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 67232 16968 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68079 17188 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 67123 17214 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 64672 17230 ns/op 8255 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 66930 17176 ns/op 8258 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 67771 17213 ns/op 8256 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 67840 17186 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 67021 17356 ns/op 8258 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68103 16956 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68192 16990 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 67870 16939 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68070 16955 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 67983 16973 ns/op 8258 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68106 16979 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68406 16997 ns/op 8256 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68214 17083 ns/op 8257 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68318 16964 ns/op 8256 B/op 338 allocs/op -BenchmarkShortRange/impl=array-trie/corpus=random/size=1048576/dir=reverse/op=full-10 68205 16980 ns/op 8257 B/op 338 allocs/op -PASS -ok github.com/phiryll/kv 4570.866s From 21db0dcd2241ea92e90ef96e70f76dab80914b8c Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:47:47 -0700 Subject: [PATCH 24/30] Minor cleanup. Don't create stores unnecessarily during BenchmarkCreate. Rename createTestStores to createStoresUnderTest. Rename benchMeanRandomKeyLen to benchRandomMeanKeyLen. Remove some obsolete comments. --- bench_test.go | 53 ++++++++++++++++++++--------------------------- fuzz_test.go | 10 ++++----- kv_test.go | 11 +++++----- reference_test.go | 1 + 4 files changed, 33 insertions(+), 42 deletions(-) diff --git a/bench_test.go b/bench_test.go index 15fe98d..b63e83b 100644 --- a/bench_test.go +++ b/bench_test.go @@ -13,18 +13,10 @@ import ( "github.com/phiryll/kv" ) -// No benchmark can have a truly random element, random seeds must be constants! - -// Because these are stateful data structures, accurately benchmarking mutating methods (Set, Delete) is cumbersome. -// The two possible approaches are to recreate the data structure every time through the loop, -// or when it reaches a state that is no longer useful to benchmark. -// The latter approach was chosen here, since recreation is expensive. -// The benchmark timer is paused when the stores are recreated. -// The measured benchmark timing overhead for pausing the timer is tiny (~8ns on my machine), -// but the wall clock overhead can be significant. +// No benchmark can have a truly random element, random seeds must be constants. const ( - benchMeanRandomKeyLen = 8 + benchRandomMeanKeyLen = 8 // Only the lowercase characters a-z and newlines appear in this file. filenameWords = "testdata/words_alpha.txt" @@ -262,7 +254,7 @@ func randomEntries(numEntries int) map[string]byte { random := rand.New(rand.NewPCG(uint64(numEntries), 83741074321)) entries := map[string]byte{} for count := 0; count < numEntries; { - key := string(randomKey(benchMeanRandomKeyLen, random)) + key := string(randomKey(benchRandomMeanKeyLen, random)) if _, ok := entries[key]; !ok { entries[key] = randomByte(random) count++ @@ -324,27 +316,29 @@ func BenchmarkFactory(b *testing.B) { for _, def := range implDefs { b.Run(def.name, func(b *testing.B) { for b.Loop() { - _ = def.factory() + def.factory() } }) } } func BenchmarkCreate(b *testing.B) { - for store := range createTestStores(slices.Values(benchStoreConfigs)) { - b.Run(store.name, func(b *testing.B) { - for b.Loop() { - s := store.def.factory() - for k, v := range store.config.ref.All() { - s.Set(k, v) + for _, config := range createBenchStoreConfigs() { + for _, def := range implDefs { + b.Run(config.name+"/"+def.name, func(b *testing.B) { + for b.Loop() { + store := def.factory() + for k, v := range config.ref.Asc(nil, nil) { + store.Set(k, v) + } } - } - }) + }) + } } } func BenchmarkGet(b *testing.B) { - for store := range createTestStores(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(store.config.ref.All())), nil) @@ -363,7 +357,7 @@ func BenchmarkGet(b *testing.B) { } func BenchmarkSet(b *testing.B) { - for store := range createTestStores(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(store.config.ref.All())), nil) @@ -386,7 +380,7 @@ func BenchmarkSet(b *testing.B) { } func BenchmarkDelete(b *testing.B) { - for store := range createTestStores(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(store.config.ref.All())), func() { @@ -429,7 +423,7 @@ func randomPairs[V any](s []V) func() (V, V) { } func BenchmarkAll(b *testing.B) { - for store := range createTestStores(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { b.Run(store.name, func(b *testing.B) { b.Run("op=init", func(b *testing.B) { for b.Loop() { @@ -449,14 +443,13 @@ func BenchmarkAll(b *testing.B) { //nolint:gocognit func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { - for store := range createTestStores(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { b.Run(store.name, func(b *testing.B) { keys := boundKeys(store.config.ref) b.Run("op=init", func(b *testing.B) { next := randomPairs(keys) for b.Loop() { - low, high := next() - store.Range(bounds(low, high)) + store.Range(bounds(next())) } }) b.Run("op=full", func(b *testing.B) { @@ -465,8 +458,7 @@ func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { } next := randomPairs(keys) for b.Loop() { - low, high := next() - for k, v := range store.Range(bounds(low, high)) { + for k, v := range store.Range(bounds(next())) { _, _ = k, v } } @@ -478,9 +470,8 @@ func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { } next := randomPairs(keys) for b.Loop() { - low, high := next() d.makeDirty() - for k, v := range store.Range(bounds(low, high)) { + for k, v := range store.Range(bounds(next())) { _, _ = k, v } } diff --git a/fuzz_test.go b/fuzz_test.go index e01ba1a..595a763 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -72,7 +72,7 @@ func createReferenceStore(config *storeConfig) ByteStore { } func FuzzGet(f *testing.F) { - fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzStoreConfigs))) + fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzStoreConfigs))) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) for _, fuzz := range fuzzStores { @@ -85,7 +85,7 @@ func FuzzGet(f *testing.F) { } func FuzzSet(f *testing.F) { - fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzStoreConfigs))) + fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzStoreConfigs))) // This only works because there is only one fuzz store config. // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. @@ -105,7 +105,7 @@ func FuzzSet(f *testing.F) { } func FuzzDelete(f *testing.F) { - fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzStoreConfigs))) + fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzStoreConfigs))) // This only works because there is only one fuzz store config. // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. @@ -125,7 +125,7 @@ func FuzzDelete(f *testing.F) { } func FuzzRange(f *testing.F) { - fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzRangeStoreConfigs))) + fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzRangeStoreConfigs))) f.Fuzz(func(t *testing.T, fuzzBeginKey, fuzzEndKey uint32, fuzzBeginKeyLen, fuzzEndKeyLen byte) { begin := keyForFuzzInputs(fuzzBeginKey, fuzzBeginKeyLen) end := keyForFuzzInputs(fuzzEndKey, fuzzEndKeyLen) @@ -147,7 +147,7 @@ func FuzzRange(f *testing.F) { } func FuzzMixed(f *testing.F) { - fuzzStores := slices.Collect(createTestStores(slices.Values(fuzzStoreConfigs))) + fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzStoreConfigs))) // This only works because there is only one fuzz store config. // This is unfortunately necessary because configs are shared between these test Stores. // This needs to be fixed. diff --git a/kv_test.go b/kv_test.go index 6f98b1e..18b4e4f 100644 --- a/kv_test.go +++ b/kv_test.go @@ -163,7 +163,7 @@ func TestPrevKey(t *testing.T) { func (s *storeUnderTest) resetFromConfig() { store := s.def.factory() for k, v := range s.config.ref.Asc(nil, nil) { - store.Set([]byte(k), v) + store.Set(k, v) } s.ByteStore = store } @@ -344,7 +344,7 @@ func createTestStoreConfigs() iter.Seq[*storeConfig] { } } -func createTestStores(storeConfigs iter.Seq[*storeConfig]) iter.Seq[*storeUnderTest] { +func createStoresUnderTest(storeConfigs iter.Seq[*storeConfig]) iter.Seq[*storeUnderTest] { return func(yield func(*storeUnderTest) bool) { for config := range storeConfigs { for _, def := range implDefs { @@ -598,7 +598,7 @@ func assertEarlyYield(t *testing.T, itr iter.Seq2[[]byte, byte]) { func TestStores(t *testing.T) { t.Parallel() - for store := range createTestStores(createTestStoreConfigs()) { + for store := range createStoresUnderTest(createTestStoreConfigs()) { t.Run(store.name, func(t *testing.T) { t.Parallel() @@ -800,9 +800,8 @@ func TestFail9(t *testing.T) { key := []byte{0x23} store.Set(key, 6) store.Delete(key) - // make sure reference.dirty is false - for range store.Range(forwardAll) { - break + if d, ok := store.(dirtyable); ok { + d.refresh() } assert.Equal(t, expected, sStore.String()) }) diff --git a/reference_test.go b/reference_test.go index adebac0..1b1d1b6 100644 --- a/reference_test.go +++ b/reference_test.go @@ -101,6 +101,7 @@ func (r *reference) All() iter.Seq2[[]byte, byte] { } } +//nolint:revive func (r *reference) between(low, high []byte) (int, int) { lowIndex, highIndex := 0, len(r.ascKeys) if low != nil { From 1b2c3f26988bd5e581d9fe85a5716588a07b3d7b Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:57:37 -0700 Subject: [PATCH 25/30] Create store configs from sequences instead of maps. --- bench_test.go | 74 ++++++++++++++++++++++----------------------------- kv_test.go | 41 +++++++++++++++++++--------- 2 files changed, 61 insertions(+), 54 deletions(-) diff --git a/bench_test.go b/bench_test.go index b63e83b..4c2df59 100644 --- a/bench_test.go +++ b/bench_test.go @@ -4,6 +4,7 @@ import ( "bufio" "encoding/binary" "fmt" + "iter" "math" rand "math/rand/v2" "os" @@ -250,65 +251,54 @@ func BenchmarkChildBounds(b *testing.B) { } } -func randomEntries(numEntries int) map[string]byte { - random := rand.New(rand.NewPCG(uint64(numEntries), 83741074321)) - entries := map[string]byte{} - for count := 0; count < numEntries; { - key := string(randomKey(benchRandomMeanKeyLen, random)) - if _, ok := entries[key]; !ok { - entries[key] = randomByte(random) - count++ +// The returned sequence does not terminate. +func randomEntries() iter.Seq2[[]byte, byte] { + return func(yield func([]byte, byte) bool) { + random := rand.New(rand.NewPCG(437120712374, 83741074321)) + for { + key := randomKey(benchRandomMeanKeyLen, random) + if !yield(key, randomByte(random)) { + return + } } } - return entries -} - -func entriesFromFile(filename string) map[string]byte { - file, err := os.Open(filename) - if err != nil { - panic(fmt.Sprintf("text file %s could not be opened: %s", filename, err)) - } - //nolint:errcheck - defer file.Close() - entries := map[string]byte{} - scanner := bufio.NewScanner(file) - for scanner.Scan() { - entries[scanner.Text()] = 0 - } - if err := scanner.Err(); err != nil { - panic(fmt.Sprintf("error reading text file %s: %s", filename, err)) - } - return entries } -func createBenchStoreConfig(corpusName string, entries map[string]byte) *storeConfig { - ref := newReference() - for k, v := range entries { - ref.Set([]byte(k), v) - } - ref.refresh() - return &storeConfig{ - name: fmt.Sprintf("corpus=%s/size=%d", corpusName, len(entries)), - size: len(entries), - ref: ref, +func entriesFromFile(filename string) iter.Seq2[[]byte, byte] { + return func(yield func([]byte, byte) bool) { + file, err := os.Open(filename) + if err != nil { + panic(fmt.Sprintf("text file %s could not be opened: %s", filename, err)) + } + //nolint:errcheck + defer file.Close() + scanner := bufio.NewScanner(file) + for scanner.Scan() { + if !yield([]byte(scanner.Text()), 0) { + return + } + } + if err := scanner.Err(); err != nil { + panic(fmt.Sprintf("error reading text file %s: %s", filename, err)) + } } } func createBenchRandomStoreConfigs() []*storeConfig { result := []*storeConfig{} for _, size := range benchRandomSizes { - result = append(result, createBenchStoreConfig("random", randomEntries(size))) + result = append(result, createTestStoreConfig("random", size, randomEntries())) } return result } // Config with lower-case english words, values are all 0. -func createBenchWordStoreConfigs() []*storeConfig { - return []*storeConfig{createBenchStoreConfig("words", entriesFromFile(filenameWords))} +func createBenchWordStoreConfig() *storeConfig { + return createTestStoreConfig("words", -1, entriesFromFile(filenameWords)) } func createBenchStoreConfigs() []*storeConfig { - return append(createBenchRandomStoreConfigs(), createBenchWordStoreConfigs()...) + return append(createBenchRandomStoreConfigs(), createBenchWordStoreConfig()) } // This helps to understand how factory() can impact other benchmarks which use it. @@ -323,7 +313,7 @@ func BenchmarkFactory(b *testing.B) { } func BenchmarkCreate(b *testing.B) { - for _, config := range createBenchStoreConfigs() { + for _, config := range benchStoreConfigs { for _, def := range implDefs { b.Run(config.name+"/"+def.name, func(b *testing.B) { for b.Loop() { diff --git a/kv_test.go b/kv_test.go index 18b4e4f..d34a6fe 100644 --- a/kv_test.go +++ b/kv_test.go @@ -326,18 +326,37 @@ func subsequences(n int) iter.Seq2[string, iter.Seq[int]] { } } +func createTestStoreConfig(corpusName string, maxSize int, itr iter.Seq2[[]byte, byte]) *storeConfig { + size := 0 + ref := newReference() + for k, v := range itr { + if _, ok := ref.Set(k, v); !ok { + size++ + } + if maxSize > 0 && size == maxSize { + break + } + } + ref.refresh() + return &storeConfig{ + fmt.Sprintf("corpus=%s/size=%d", corpusName, size), + size, + ref, + } +} + // storeConfigs for all possible subsequences of presentKeys. func createTestStoreConfigs() iter.Seq[*storeConfig] { return func(yield func(*storeConfig) bool) { for name, indexIter := range subsequences(len(testPresentKeys)) { - ref := newReference() - size := 0 - for i := range indexIter { - ref.Set(testPresentKeys[i], byte(i)) - size++ + keyValueItr := func(yieldKeyValue func([]byte, byte) bool) { + for i := range indexIter { + if !yieldKeyValue(testPresentKeys[i], byte(i)) { + return + } + } } - ref.refresh() - if !yield(&storeConfig{"sub-store=" + name, size, ref}) { + if !yield(createTestStoreConfig(name, -1, keyValueItr)) { return } } @@ -348,11 +367,9 @@ func createStoresUnderTest(storeConfigs iter.Seq[*storeConfig]) iter.Seq[*storeU return func(yield func(*storeUnderTest) bool) { for config := range storeConfigs { for _, def := range implDefs { - store := def.factory() - for k, v := range config.ref.All() { - store.Set(k, v) - } - if !yield(&storeUnderTest{config.name + "/" + def.name, def, config, store}) { + store := storeUnderTest{config.name + "/" + def.name, def, config, nil} + store.resetFromConfig() + if !yield(&store) { return } } From d901d704af1a887e0c166d80c08361f196f4bc90 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 18:36:15 -0700 Subject: [PATCH 26/30] Create benchmark configs and stores on the fly. --- bench_test.go | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/bench_test.go b/bench_test.go index 4c2df59..fa2e972 100644 --- a/bench_test.go +++ b/bench_test.go @@ -26,8 +26,6 @@ const ( var ( // How many entries randomly generated benchmarked stores will have. benchRandomSizes = []int{1 << 16, 1 << 18, 1 << 20} - - benchStoreConfigs = createBenchStoreConfigs() ) func randomBytes(n int, random *rand.Rand) []byte { @@ -284,24 +282,18 @@ func entriesFromFile(filename string) iter.Seq2[[]byte, byte] { } } -func createBenchRandomStoreConfigs() []*storeConfig { - result := []*storeConfig{} - for _, size := range benchRandomSizes { - result = append(result, createTestStoreConfig("random", size, randomEntries())) +func createBenchStoreConfigs() iter.Seq[*storeConfig] { + return func(yield func(*storeConfig) bool) { + for _, size := range benchRandomSizes { + if !yield(createTestStoreConfig("random", size, randomEntries())) { + return + } + } + yield(createTestStoreConfig("words", -1, entriesFromFile(filenameWords))) } - return result -} - -// Config with lower-case english words, values are all 0. -func createBenchWordStoreConfig() *storeConfig { - return createTestStoreConfig("words", -1, entriesFromFile(filenameWords)) -} - -func createBenchStoreConfigs() []*storeConfig { - return append(createBenchRandomStoreConfigs(), createBenchWordStoreConfig()) } -// This helps to understand how factory() can impact other benchmarks which use it. +// Just making sure factory() isn't expensive. func BenchmarkFactory(b *testing.B) { for _, def := range implDefs { b.Run(def.name, func(b *testing.B) { @@ -313,7 +305,7 @@ func BenchmarkFactory(b *testing.B) { } func BenchmarkCreate(b *testing.B) { - for _, config := range benchStoreConfigs { + for config := range createBenchStoreConfigs() { for _, def := range implDefs { b.Run(config.name+"/"+def.name, func(b *testing.B) { for b.Loop() { @@ -328,7 +320,7 @@ func BenchmarkCreate(b *testing.B) { } func BenchmarkGet(b *testing.B) { - for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(createBenchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(store.config.ref.All())), nil) @@ -347,7 +339,7 @@ func BenchmarkGet(b *testing.B) { } func BenchmarkSet(b *testing.B) { - for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(createBenchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(store.config.ref.All())), nil) @@ -370,7 +362,7 @@ func BenchmarkSet(b *testing.B) { } func BenchmarkDelete(b *testing.B) { - for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(createBenchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(store.config.ref.All())), func() { @@ -413,7 +405,7 @@ func randomPairs[V any](s []V) func() (V, V) { } func BenchmarkAll(b *testing.B) { - for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(createBenchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { b.Run("op=init", func(b *testing.B) { for b.Loop() { @@ -433,7 +425,7 @@ func BenchmarkAll(b *testing.B) { //nolint:gocognit func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { - for store := range createStoresUnderTest(slices.Values(benchStoreConfigs)) { + for store := range createStoresUnderTest(createBenchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { keys := boundKeys(store.config.ref) b.Run("op=init", func(b *testing.B) { From 4c1b71713d0e520e4d56ecfe8aba40168b8d8b5a Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 19:34:31 -0700 Subject: [PATCH 27/30] Compute fuzz configs and stores on the fly. But still collect them once. --- bench_test.go | 14 +++--- fuzz_test.go | 126 ++++++++++++++++++++++---------------------------- kv_test.go | 6 +++ 3 files changed, 67 insertions(+), 79 deletions(-) diff --git a/bench_test.go b/bench_test.go index fa2e972..ff4bede 100644 --- a/bench_test.go +++ b/bench_test.go @@ -23,10 +23,8 @@ const ( filenameWords = "testdata/words_alpha.txt" ) -var ( - // How many entries randomly generated benchmarked stores will have. - benchRandomSizes = []int{1 << 16, 1 << 18, 1 << 20} -) +// How many entries randomly generated benchmarked stores will have. +var benchRandomSizes = []int{1 << 16, 1 << 18, 1 << 20} func randomBytes(n int, random *rand.Rand) []byte { if n == 0 { @@ -250,11 +248,10 @@ func BenchmarkChildBounds(b *testing.B) { } // The returned sequence does not terminate. -func randomEntries() iter.Seq2[[]byte, byte] { +func randomEntries(meanKeyLen int, random *rand.Rand) iter.Seq2[[]byte, byte] { return func(yield func([]byte, byte) bool) { - random := rand.New(rand.NewPCG(437120712374, 83741074321)) for { - key := randomKey(benchRandomMeanKeyLen, random) + key := randomKey(meanKeyLen, random) if !yield(key, randomByte(random)) { return } @@ -285,7 +282,8 @@ func entriesFromFile(filename string) iter.Seq2[[]byte, byte] { func createBenchStoreConfigs() iter.Seq[*storeConfig] { return func(yield func(*storeConfig) bool) { for _, size := range benchRandomSizes { - if !yield(createTestStoreConfig("random", size, randomEntries())) { + random := rand.New(rand.NewPCG(437120712374, 83741074321)) + if !yield(createTestStoreConfig("random", size, randomEntries(benchRandomMeanKeyLen, random))) { return } } diff --git a/fuzz_test.go b/fuzz_test.go index 595a763..ad0c650 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -23,12 +23,6 @@ const ( fuzzMeanKeyLen = 4 ) -var ( - // There is currently only one config in each of these slices. - fuzzStoreConfigs = createFuzzStoreConfigs(fuzzSize) - fuzzRangeStoreConfigs = createFuzzStoreConfigs(fuzzRangeSize) -) - // Fuzz testing is very parallel, and stores aren't generally thread-safe. // Ensure that instances are not shared. @@ -51,17 +45,9 @@ func keyForFuzzInputs(fuzzKey uint32, fuzzKeyLen byte) []byte { return keyBytes[(4 - keyLen):] // use low-order bytes } -func createFuzzStoreConfigs(size int) []*storeConfig { +func createFuzzStoreConfig(corpusName string, size int) *storeConfig { random := rand.New(rand.NewPCG(rand.Uint64(), rand.Uint64())) - ref := newReference() - for count := 0; count < size; { - key := randomKey(fuzzMeanKeyLen, random) - if _, ok := ref.Get(key); !ok { - ref.Set(key, randomByte(random)) - count++ - } - } - return []*storeConfig{{"fuzz", size, ref}} + return createTestStoreConfig(corpusName, size, randomEntries(fuzzMeanKeyLen, random)) } func createReferenceStore(config *storeConfig) ByteStore { @@ -72,60 +58,60 @@ func createReferenceStore(config *storeConfig) ByteStore { } func FuzzGet(f *testing.F) { - fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzStoreConfigs))) + config := createFuzzStoreConfig("fuzz", fuzzSize) + stores := slices.Collect(createStoresUnderTest(singleton(config))) + ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) - for _, fuzz := range fuzzStores { - expected, expectedOk := fuzz.config.ref.Get(key) - actual, actualOk := fuzz.Get(key) - assert.Equal(t, expectedOk, actualOk, "%s: %s", fuzz.def.name, kv.KeyName(key)) - assert.Equal(t, expected, actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) + expected, expectedOk := ref.Get(key) + for _, store := range stores { + actual, actualOk := store.Get(key) + assert.Equal(t, expectedOk, actualOk, "%s: %s", store.def.name, kv.KeyName(key)) + assert.Equal(t, expected, actual, "%s: %s", store.def.name, kv.KeyName(key)) } }) } func FuzzSet(f *testing.F) { - fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzStoreConfigs))) - // This only works because there is only one fuzz store config. - // This is unfortunately necessary because configs are shared between these test Stores. - // This needs to be fixed. - ref := createReferenceStore(fuzzStoreConfigs[0]) + config := createFuzzStoreConfig("fuzz", fuzzSize) + stores := slices.Collect(createStoresUnderTest(singleton(config))) + ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen, value byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) expected, expectedOk := ref.Set(key, value) - for _, fuzz := range fuzzStores { - actual, actualOk := fuzz.Set(key, value) - assert.Equal(t, expectedOk, actualOk, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) - assert.Equal(t, expected, actual, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) - actual, ok := fuzz.Get(key) - assert.True(t, ok, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) - assert.Equal(t, value, actual, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) + for _, store := range stores { + actual, actualOk := store.Set(key, value) + assert.Equal(t, expectedOk, actualOk, "%s: %s=%d", store.def.name, kv.KeyName(key), value) + assert.Equal(t, expected, actual, "%s: %s=%d", store.def.name, kv.KeyName(key), value) + actual, ok := store.Get(key) + assert.True(t, ok, "%s: %s=%d", store.def.name, kv.KeyName(key), value) + assert.Equal(t, value, actual, "%s: %s=%d", store.def.name, kv.KeyName(key), value) } }) } func FuzzDelete(f *testing.F) { - fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzStoreConfigs))) - // This only works because there is only one fuzz store config. - // This is unfortunately necessary because configs are shared between these test Stores. - // This needs to be fixed. - ref := createReferenceStore(fuzzStoreConfigs[0]) + config := createFuzzStoreConfig("fuzz", fuzzSize) + stores := slices.Collect(createStoresUnderTest(singleton(config))) + ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) expected, expectedOk := ref.Delete(key) - for _, fuzz := range fuzzStores { - actual, actualOk := fuzz.Delete(key) - assert.Equal(t, expectedOk, actualOk, "%s: %s", fuzz.def.name, kv.KeyName(key)) - assert.Equal(t, expected, actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) - actual, ok := fuzz.Get(key) - assert.False(t, ok, "%s: %s", fuzz.def.name, kv.KeyName(key)) - assert.Equal(t, byte(0), actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) + for _, store := range stores { + actual, actualOk := store.Delete(key) + assert.Equal(t, expectedOk, actualOk, "%s: %s", store.def.name, kv.KeyName(key)) + assert.Equal(t, expected, actual, "%s: %s", store.def.name, kv.KeyName(key)) + actual, ok := store.Get(key) + assert.False(t, ok, "%s: %s", store.def.name, kv.KeyName(key)) + assert.Equal(t, byte(0), actual, "%s: %s", store.def.name, kv.KeyName(key)) } }) } func FuzzRange(f *testing.F) { - fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzRangeStoreConfigs))) + config := createFuzzStoreConfig("fuzz-range", fuzzRangeSize) + stores := slices.Collect(createStoresUnderTest(singleton(config))) + ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzBeginKey, fuzzEndKey uint32, fuzzBeginKeyLen, fuzzEndKeyLen byte) { begin := keyForFuzzInputs(fuzzBeginKey, fuzzBeginKeyLen) end := keyForFuzzInputs(fuzzEndKey, fuzzEndKeyLen) @@ -137,42 +123,40 @@ func FuzzRange(f *testing.F) { } forward := From(begin).To(end) reverse := From(end).DownTo(begin) - for _, fuzz := range fuzzStores { - assertItersEqual(t, fuzz.config.ref.Range(forward), fuzz.Range(forward), - "%s: %s", fuzz.def.name, forward) - assertItersEqual(t, fuzz.config.ref.Range(reverse), fuzz.Range(reverse), - "%s: %s", fuzz.def.name, reverse) + refForward := ref.Range(forward) + refReverse := ref.Range(reverse) + for _, store := range stores { + assertItersEqual(t, refForward, store.Range(forward), "%s: %s", store.def.name, forward) + assertItersEqual(t, refReverse, store.Range(reverse), "%s: %s", store.def.name, reverse) } }) } func FuzzMixed(f *testing.F) { - fuzzStores := slices.Collect(createStoresUnderTest(slices.Values(fuzzStoreConfigs))) - // This only works because there is only one fuzz store config. - // This is unfortunately necessary because configs are shared between these test Stores. - // This needs to be fixed. - ref := createReferenceStore(fuzzStoreConfigs[0]) + config := createFuzzStoreConfig("fuzz", fuzzSize) + stores := slices.Collect(createStoresUnderTest(singleton(config))) + ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzSetKey, fuzzDeleteKey uint32, fuzzSetKeyLen, fuzzDeleteKeyLen, value byte) { key := keyForFuzzInputs(fuzzSetKey, fuzzSetKeyLen) expected, expectedOk := ref.Set(key, value) - for _, fuzz := range fuzzStores { - actual, actualOk := fuzz.Set(key, value) - assert.Equal(t, expectedOk, actualOk, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) - assert.Equal(t, expected, actual, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) - actual, ok := fuzz.Get(key) - assert.True(t, ok, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) - assert.Equal(t, value, actual, "%s: %s=%d", fuzz.def.name, kv.KeyName(key), value) + for _, store := range stores { + actual, actualOk := store.Set(key, value) + assert.Equal(t, expectedOk, actualOk, "%s: %s=%d", store.def.name, kv.KeyName(key), value) + assert.Equal(t, expected, actual, "%s: %s=%d", store.def.name, kv.KeyName(key), value) + actual, ok := store.Get(key) + assert.True(t, ok, "%s: %s=%d", store.def.name, kv.KeyName(key), value) + assert.Equal(t, value, actual, "%s: %s=%d", store.def.name, kv.KeyName(key), value) } key = keyForFuzzInputs(fuzzDeleteKey, fuzzDeleteKeyLen) expected, expectedOk = ref.Delete(key) - for _, fuzz := range fuzzStores { - actual, actualOk := fuzz.Delete(key) - assert.Equal(t, expectedOk, actualOk, "%s: %s", fuzz.def.name, kv.KeyName(key)) - assert.Equal(t, expected, actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) - actual, ok := fuzz.Get(key) - assert.False(t, ok, "%s: %s", fuzz.def.name, kv.KeyName(key)) - assert.Equal(t, byte(0), actual, "%s: %s", fuzz.def.name, kv.KeyName(key)) + for _, store := range stores { + actual, actualOk := store.Delete(key) + assert.Equal(t, expectedOk, actualOk, "%s: %s", store.def.name, kv.KeyName(key)) + assert.Equal(t, expected, actual, "%s: %s", store.def.name, kv.KeyName(key)) + actual, ok := store.Get(key) + assert.False(t, ok, "%s: %s", store.def.name, kv.KeyName(key)) + assert.Equal(t, byte(0), actual, "%s: %s", store.def.name, kv.KeyName(key)) } }) } diff --git a/kv_test.go b/kv_test.go index d34a6fe..03e83ef 100644 --- a/kv_test.go +++ b/kv_test.go @@ -168,6 +168,12 @@ func (s *storeUnderTest) resetFromConfig() { s.ByteStore = store } +func singleton[V any](value V) iter.Seq[V] { + return func(yield func(V) bool) { + yield(value) + } +} + // Returns an iterator over the keys of itr. func keyIter[K, V any](itr iter.Seq2[K, V]) iter.Seq[K] { return func(yield func(K) bool) { From 7cb22511c070cfbf56419309663b91604d2bace2 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 20:14:05 -0700 Subject: [PATCH 28/30] Don't name sequence-returning functions "create...". --- bench_test.go | 20 +++++++++++--------- fuzz_test.go | 10 +++++----- kv_test.go | 6 +++--- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/bench_test.go b/bench_test.go index ff4bede..c3c547c 100644 --- a/bench_test.go +++ b/bench_test.go @@ -23,8 +23,10 @@ const ( filenameWords = "testdata/words_alpha.txt" ) -// How many entries randomly generated benchmarked stores will have. -var benchRandomSizes = []int{1 << 16, 1 << 18, 1 << 20} +var ( + // How many entries randomly generated benchmarked stores will have. + benchRandomSizes = []int{1 << 16, 1 << 18, 1 << 20} +) func randomBytes(n int, random *rand.Rand) []byte { if n == 0 { @@ -279,7 +281,7 @@ func entriesFromFile(filename string) iter.Seq2[[]byte, byte] { } } -func createBenchStoreConfigs() iter.Seq[*storeConfig] { +func benchStoreConfigs() iter.Seq[*storeConfig] { return func(yield func(*storeConfig) bool) { for _, size := range benchRandomSizes { random := rand.New(rand.NewPCG(437120712374, 83741074321)) @@ -303,7 +305,7 @@ func BenchmarkFactory(b *testing.B) { } func BenchmarkCreate(b *testing.B) { - for config := range createBenchStoreConfigs() { + for config := range benchStoreConfigs() { for _, def := range implDefs { b.Run(config.name+"/"+def.name, func(b *testing.B) { for b.Loop() { @@ -318,7 +320,7 @@ func BenchmarkCreate(b *testing.B) { } func BenchmarkGet(b *testing.B) { - for store := range createStoresUnderTest(createBenchStoreConfigs()) { + for store := range storesUnderTest(benchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(store.config.ref.All())), nil) @@ -337,7 +339,7 @@ func BenchmarkGet(b *testing.B) { } func BenchmarkSet(b *testing.B) { - for store := range createStoresUnderTest(createBenchStoreConfigs()) { + for store := range storesUnderTest(benchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(store.config.ref.All())), nil) @@ -360,7 +362,7 @@ func BenchmarkSet(b *testing.B) { } func BenchmarkDelete(b *testing.B) { - for store := range createStoresUnderTest(createBenchStoreConfigs()) { + for store := range storesUnderTest(benchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { b.Run("existing=true", func(b *testing.B) { next := repeat(slices.Collect(keyIter(store.config.ref.All())), func() { @@ -403,7 +405,7 @@ func randomPairs[V any](s []V) func() (V, V) { } func BenchmarkAll(b *testing.B) { - for store := range createStoresUnderTest(createBenchStoreConfigs()) { + for store := range storesUnderTest(benchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { b.Run("op=init", func(b *testing.B) { for b.Loop() { @@ -423,7 +425,7 @@ func BenchmarkAll(b *testing.B) { //nolint:gocognit func benchRange(b *testing.B, bounds func(low, high []byte) *Bounds) { - for store := range createStoresUnderTest(createBenchStoreConfigs()) { + for store := range storesUnderTest(benchStoreConfigs()) { b.Run(store.name, func(b *testing.B) { keys := boundKeys(store.config.ref) b.Run("op=init", func(b *testing.B) { diff --git a/fuzz_test.go b/fuzz_test.go index ad0c650..ce403f3 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -59,7 +59,7 @@ func createReferenceStore(config *storeConfig) ByteStore { func FuzzGet(f *testing.F) { config := createFuzzStoreConfig("fuzz", fuzzSize) - stores := slices.Collect(createStoresUnderTest(singleton(config))) + stores := slices.Collect(storesUnderTest(singleton(config))) ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) @@ -74,7 +74,7 @@ func FuzzGet(f *testing.F) { func FuzzSet(f *testing.F) { config := createFuzzStoreConfig("fuzz", fuzzSize) - stores := slices.Collect(createStoresUnderTest(singleton(config))) + stores := slices.Collect(storesUnderTest(singleton(config))) ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen, value byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) @@ -92,7 +92,7 @@ func FuzzSet(f *testing.F) { func FuzzDelete(f *testing.F) { config := createFuzzStoreConfig("fuzz", fuzzSize) - stores := slices.Collect(createStoresUnderTest(singleton(config))) + stores := slices.Collect(storesUnderTest(singleton(config))) ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzKey uint32, fuzzKeyLen byte) { key := keyForFuzzInputs(fuzzKey, fuzzKeyLen) @@ -110,7 +110,7 @@ func FuzzDelete(f *testing.F) { func FuzzRange(f *testing.F) { config := createFuzzStoreConfig("fuzz-range", fuzzRangeSize) - stores := slices.Collect(createStoresUnderTest(singleton(config))) + stores := slices.Collect(storesUnderTest(singleton(config))) ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzBeginKey, fuzzEndKey uint32, fuzzBeginKeyLen, fuzzEndKeyLen byte) { begin := keyForFuzzInputs(fuzzBeginKey, fuzzBeginKeyLen) @@ -134,7 +134,7 @@ func FuzzRange(f *testing.F) { func FuzzMixed(f *testing.F) { config := createFuzzStoreConfig("fuzz", fuzzSize) - stores := slices.Collect(createStoresUnderTest(singleton(config))) + stores := slices.Collect(storesUnderTest(singleton(config))) ref := createReferenceStore(config) f.Fuzz(func(t *testing.T, fuzzSetKey, fuzzDeleteKey uint32, fuzzSetKeyLen, fuzzDeleteKeyLen, value byte) { key := keyForFuzzInputs(fuzzSetKey, fuzzSetKeyLen) diff --git a/kv_test.go b/kv_test.go index 03e83ef..10639c8 100644 --- a/kv_test.go +++ b/kv_test.go @@ -352,7 +352,7 @@ func createTestStoreConfig(corpusName string, maxSize int, itr iter.Seq2[[]byte, } // storeConfigs for all possible subsequences of presentKeys. -func createTestStoreConfigs() iter.Seq[*storeConfig] { +func testStoreConfigs() iter.Seq[*storeConfig] { return func(yield func(*storeConfig) bool) { for name, indexIter := range subsequences(len(testPresentKeys)) { keyValueItr := func(yieldKeyValue func([]byte, byte) bool) { @@ -369,7 +369,7 @@ func createTestStoreConfigs() iter.Seq[*storeConfig] { } } -func createStoresUnderTest(storeConfigs iter.Seq[*storeConfig]) iter.Seq[*storeUnderTest] { +func storesUnderTest(storeConfigs iter.Seq[*storeConfig]) iter.Seq[*storeUnderTest] { return func(yield func(*storeUnderTest) bool) { for config := range storeConfigs { for _, def := range implDefs { @@ -621,7 +621,7 @@ func assertEarlyYield(t *testing.T, itr iter.Seq2[[]byte, byte]) { func TestStores(t *testing.T) { t.Parallel() - for store := range createStoresUnderTest(createTestStoreConfigs()) { + for store := range storesUnderTest(testStoreConfigs()) { t.Run(store.name, func(t *testing.T) { t.Parallel() From 136c4f54851b6aff590603ea2a681e70bf86036b Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 20:16:51 -0700 Subject: [PATCH 29/30] Update comment. --- kv_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kv_test.go b/kv_test.go index 10639c8..96935a7 100644 --- a/kv_test.go +++ b/kv_test.go @@ -32,9 +32,7 @@ type ( // A description of a store to be tested or benchmarked. // Some fields may not be populated depending on the use case. - // - // For benchmarking, there is one storeConfig for each corpus used by all benchmarks, - // shared by all store implementations. + // Note that storeConfigs are often reused between multiple storeUnderTest instances. storeConfig struct { name string size int From 5c1ec0ce68a4db4c3871645a46d8f1dd63c061d4 Mon Sep 17 00:00:00 2001 From: Jennifer Conner <2819667+phiryll@users.noreply.github.com> Date: Tue, 15 Jul 2025 20:18:49 -0700 Subject: [PATCH 30/30] Linter fix. --- bench_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bench_test.go b/bench_test.go index c3c547c..d27b099 100644 --- a/bench_test.go +++ b/bench_test.go @@ -23,10 +23,8 @@ const ( filenameWords = "testdata/words_alpha.txt" ) -var ( - // How many entries randomly generated benchmarked stores will have. - benchRandomSizes = []int{1 << 16, 1 << 18, 1 << 20} -) +// How many entries randomly generated benchmarked stores will have. +var benchRandomSizes = []int{1 << 16, 1 << 18, 1 << 20} func randomBytes(n int, random *rand.Rand) []byte { if n == 0 {