github.com/alexflint/go-memdump@v1.1.0/bench/bench_test.go (about) 1 // Package bench contains benchmarks that compare memdump with other 2 // serialization packages. This code is in a separate package to avoid 3 // introducing unnecessary dependencies to memdump. 4 5 package main 6 7 import ( 8 "bytes" 9 "encoding/gob" 10 "encoding/json" 11 "fmt" 12 "testing" 13 14 memdump "github.com/alexflint/go-memdump" 15 "github.com/stretchr/testify/require" 16 ) 17 18 const ( 19 minDepth = 16 20 maxDepth = 16 21 degree = 2 22 ) 23 24 func BenchmarkHomogeneousMemdump(b *testing.B) { 25 var bufs [][]byte 26 for i := minDepth; i <= maxDepth; i++ { 27 in := generateTree(i, degree) 28 var buf bytes.Buffer 29 enc := memdump.NewEncoder(&buf) 30 err := enc.Encode(in) 31 require.NoError(b, err) 32 bufs = append(bufs, buf.Bytes()) 33 } 34 35 for d, buf := range bufs { 36 b.Run(fmt.Sprintf("depth=%d", d), func(b *testing.B) { 37 for i := 0; i < b.N; i++ { 38 dec := memdump.NewDecoder(bytes.NewBuffer(buf)) 39 var out treeNode 40 err := dec.Decode(&out) 41 require.NoError(b, err) 42 } 43 }) 44 } 45 } 46 47 func BenchmarkSingleMemdump(b *testing.B) { 48 var bufs [][]byte 49 for i := minDepth; i <= maxDepth; i++ { 50 in := generateTree(i, degree) 51 var buf bytes.Buffer 52 err := memdump.Encode(&buf, in) 53 require.NoError(b, err) 54 bufs = append(bufs, buf.Bytes()) 55 } 56 57 for d, buf := range bufs { 58 b.Run(fmt.Sprintf("depth=%d", d), func(b *testing.B) { 59 for i := 0; i < b.N; i++ { 60 var out *treeNode 61 err := memdump.Decode(bytes.NewBuffer(buf), &out) 62 require.NoError(b, err) 63 } 64 }) 65 } 66 } 67 68 func BenchmarkGob(b *testing.B) { 69 var bufs [][]byte 70 for i := minDepth; i <= maxDepth; i++ { 71 in := generateTree(i, degree) 72 var buf bytes.Buffer 73 enc := gob.NewEncoder(&buf) 74 err := enc.Encode(in) 75 require.NoError(b, err) 76 bufs = append(bufs, buf.Bytes()) 77 } 78 79 for d, buf := range bufs { 80 b.Run(fmt.Sprintf("depth=%d", d), func(b *testing.B) { 81 for i := 0; i < b.N; i++ { 82 dec := gob.NewDecoder(bytes.NewBuffer(buf)) 83 var out treeNode 84 err := dec.Decode(&out) 85 require.NoError(b, err) 86 } 87 }) 88 } 89 } 90 91 func BenchmarkJSON(b *testing.B) { 92 var bufs [][]byte 93 for i := minDepth; i <= maxDepth; i++ { 94 in := generateTree(i, degree) 95 buf, err := json.Marshal(in) 96 require.NoError(b, err) 97 bufs = append(bufs, buf) 98 } 99 100 for d, buf := range bufs { 101 b.Run(fmt.Sprintf("depth=%d", d), func(b *testing.B) { 102 for i := 0; i < b.N; i++ { 103 var out treeNode 104 err := json.Unmarshal(buf, &out) 105 require.NoError(b, err) 106 } 107 }) 108 } 109 }