github.com/cockroachdb/pebble@v1.1.1-0.20240513155919-3622ade60459/sstable/unsafe_test.go (about) 1 // Copyright 2018 The LevelDB-Go and Pebble Authors. All rights reserved. Use 2 // of this source code is governed by a BSD-style license that can be found in 3 // the LICENSE file. 4 5 package sstable 6 7 import ( 8 "encoding/binary" 9 "fmt" 10 "io" 11 "testing" 12 "time" 13 "unsafe" 14 15 "github.com/stretchr/testify/require" 16 "golang.org/x/exp/rand" 17 ) 18 19 func TestGetBytes(t *testing.T) { 20 const size = (1 << 31) - 1 21 // No need to actually allocate a huge slice, which can cause OOM on small 22 // machines (like the GitHub CI runners). 23 block := make([]byte, 100) 24 data := getBytes(unsafe.Pointer(&block[0]), size) 25 require.EqualValues(t, size, len(data)) 26 } 27 28 func TestDecodeVarint(t *testing.T) { 29 vals := []uint32{ 30 0, 31 1, 32 1 << 7, 33 1 << 8, 34 1 << 14, 35 1 << 15, 36 1 << 20, 37 1 << 21, 38 1 << 28, 39 1 << 29, 40 1 << 31, 41 } 42 buf := make([]byte, 5) 43 for _, v := range vals { 44 binary.PutUvarint(buf, uint64(v)) 45 u, _ := decodeVarint(unsafe.Pointer(&buf[0])) 46 if v != u { 47 fmt.Printf("%d %d\n", v, u) 48 } 49 } 50 } 51 52 func BenchmarkDecodeVarint(b *testing.B) { 53 rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano()))) 54 vals := make([]unsafe.Pointer, 10000) 55 for i := range vals { 56 buf := make([]byte, 5) 57 binary.PutUvarint(buf, uint64(rng.Uint32())) 58 vals[i] = unsafe.Pointer(&buf[0]) 59 } 60 61 b.ResetTimer() 62 var ptr unsafe.Pointer 63 for i, n := 0, 0; i < b.N; i += n { 64 n = len(vals) 65 if n > b.N-i { 66 n = b.N - i 67 } 68 for j := 0; j < n; j++ { 69 _, ptr = decodeVarint(vals[j]) 70 } 71 } 72 if testing.Verbose() { 73 fmt.Fprint(io.Discard, ptr) 74 } 75 }