github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/utils/fast/buffer_test.go (about) 1 package fast 2 3 import ( 4 "bytes" 5 "math/rand" 6 "testing" 7 8 "github.com/stretchr/testify/require" 9 ) 10 11 func TestBuffer(t *testing.T) { 12 const N = 100 13 14 var ( 15 w *Writer 16 r *Reader 17 bb = []byte{0, 0, 0xFF, 9, 0} 18 ) 19 20 t.Run("Writer", func(t *testing.T) { 21 require := require.New(t) 22 23 w = NewWriter(make([]byte, 0, N/2)) 24 for i := byte(0); i < N; i++ { 25 w.WriteByte(i) 26 } 27 require.Equal(N, len(w.Bytes())) 28 w.Write(bb) 29 require.Equal(N+len(bb), len(w.Bytes())) 30 }) 31 32 t.Run("Reader", func(t *testing.T) { 33 require := require.New(t) 34 35 r = NewReader(w.Bytes()) 36 require.Equal(N+len(bb), len(r.Bytes())) 37 require.False(r.Empty()) 38 for exp := byte(0); exp < N; exp++ { 39 got := r.ReadByte() 40 require.Equal(exp, got) 41 } 42 require.Equal(N, r.Position()) 43 got := r.Read(len(bb)) 44 require.Equal(bb, got) 45 require.True(r.Empty()) 46 }) 47 } 48 49 func Benchmark(b *testing.B) { 50 b.Run("Write", func(b *testing.B) { 51 b.Run("Std", func(b *testing.B) { 52 w := bytes.NewBuffer(make([]byte, 0, b.N)) 53 for i := 0; i < b.N; i++ { 54 w.WriteByte(byte(i)) 55 } 56 require.Equal(b, b.N, len(w.Bytes())) 57 }) 58 b.Run("Fast", func(b *testing.B) { 59 w := NewWriter(make([]byte, 0, b.N)) 60 for i := 0; i < b.N; i++ { 61 w.WriteByte(byte(i)) 62 } 63 require.Equal(b, b.N, len(w.Bytes())) 64 }) 65 }) 66 67 b.Run("Read", func(b *testing.B) { 68 src := make([]byte, 1000) 69 rand.Read(src) 70 71 b.Run("Std", func(b *testing.B) { 72 for i := 0; i < b.N; i++ { 73 r := bytes.NewReader(src) 74 for j := 0; j < len(src); j++ { 75 _, _ = r.ReadByte() 76 } 77 } 78 }) 79 b.Run("Fast", func(b *testing.B) { 80 for i := 0; i < b.N; i++ { 81 r := NewReader(src) 82 for j := 0; j < len(src); j++ { 83 _ = r.ReadByte() 84 } 85 } 86 }) 87 }) 88 }