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  }