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  }