github.com/ipld/go-ipld-prime@v0.21.0/fluent/bench_test.go (about)

     1  package fluent_test
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/ipld/go-ipld-prime/codec/dagjson"
     8  	"github.com/ipld/go-ipld-prime/datamodel"
     9  	"github.com/ipld/go-ipld-prime/fluent"
    10  	"github.com/ipld/go-ipld-prime/fluent/qp"
    11  	"github.com/ipld/go-ipld-prime/node/basicnode"
    12  )
    13  
    14  func BenchmarkQp(b *testing.B) {
    15  	b.ReportAllocs()
    16  
    17  	f2 := func(na datamodel.NodeAssembler, a string, b string, c string, d []string) {
    18  		qp.Map(4, func(ma datamodel.MapAssembler) {
    19  			qp.MapEntry(ma, "destination", qp.String(a))
    20  			qp.MapEntry(ma, "type", qp.String(b))
    21  			qp.MapEntry(ma, "source", qp.String(c))
    22  			qp.MapEntry(ma, "options", qp.List(int64(len(d)), func(la datamodel.ListAssembler) {
    23  				for _, s := range d {
    24  					qp.ListEntry(la, qp.String(s))
    25  				}
    26  			}))
    27  		})(na)
    28  	}
    29  	for i := 0; i < b.N; i++ {
    30  		n, err := qp.BuildList(basicnode.Prototype.Any, -1, func(la datamodel.ListAssembler) {
    31  			f2(la.AssembleValue(), // TODO: forgot to check error?
    32  				"/",
    33  				"overlay",
    34  				"none",
    35  				[]string{
    36  					"lowerdir=" + "/",
    37  					"upperdir=" + "/tmp/overlay-root/upper",
    38  					"workdir=" + "/tmp/overlay-root/work",
    39  				},
    40  			)
    41  		})
    42  		if err != nil {
    43  			b.Fatal(err)
    44  		}
    45  		_ = n
    46  	}
    47  }
    48  
    49  func BenchmarkUnmarshal(b *testing.B) {
    50  	b.ReportAllocs()
    51  
    52  	var n datamodel.Node
    53  	var err error
    54  	serial := `[{
    55  		"destination": "/",
    56  		"type": "overlay",
    57  		"source": "none",
    58  		"options": [
    59  			"lowerdir=/",
    60  			"upperdir=/tmp/overlay-root/upper",
    61  			"workdir=/tmp/overlay-root/work"
    62  		]
    63  	}]`
    64  	r := strings.NewReader(serial)
    65  	for i := 0; i < b.N; i++ {
    66  		nb := basicnode.Prototype.Any.NewBuilder()
    67  		err = dagjson.Decode(nb, r)
    68  		n = nb.Build()
    69  		r.Reset(serial)
    70  	}
    71  	_ = n
    72  	if err != nil {
    73  		b.Fatal(err)
    74  	}
    75  }
    76  
    77  func BenchmarkFluent(b *testing.B) {
    78  	b.ReportAllocs()
    79  
    80  	var n datamodel.Node
    81  	var err error
    82  	for i := 0; i < b.N; i++ {
    83  		n, err = fluent.BuildList(basicnode.Prototype.Any, -1, func(la fluent.ListAssembler) {
    84  			la.AssembleValue().CreateMap(4, func(ma fluent.MapAssembler) {
    85  				ma.AssembleEntry("destination").AssignString("/")
    86  				ma.AssembleEntry("type").AssignString("overlay")
    87  				ma.AssembleEntry("source").AssignString("none")
    88  				ma.AssembleEntry("options").CreateList(-1, func(la fluent.ListAssembler) {
    89  					la.AssembleValue().AssignString("lowerdir=" + "/")
    90  					la.AssembleValue().AssignString("upperdir=" + "/tmp/overlay-root/upper")
    91  					la.AssembleValue().AssignString("workdir=" + "/tmp/overlay-root/work")
    92  				})
    93  			})
    94  		})
    95  	}
    96  	_ = n
    97  	if err != nil {
    98  		b.Fatal(err)
    99  	}
   100  }
   101  
   102  func BenchmarkReflect(b *testing.B) {
   103  	b.ReportAllocs()
   104  
   105  	var n datamodel.Node
   106  	var err error
   107  	val := []interface{}{
   108  		map[string]interface{}{
   109  			"destination": "/",
   110  			"type":        "overlay",
   111  			"source":      "none",
   112  			"options": []string{
   113  				"lowerdir=/",
   114  				"upperdir=/tmp/overlay-root/upper",
   115  				"workdir=/tmp/overlay-root/work",
   116  			},
   117  		},
   118  	}
   119  	for i := 0; i < b.N; i++ {
   120  		n, err = fluent.Reflect(basicnode.Prototype.Any, val)
   121  	}
   122  	_ = n
   123  	if err != nil {
   124  		b.Fatal(err)
   125  	}
   126  }
   127  
   128  func BenchmarkReflectIncludingInitialization(b *testing.B) {
   129  	b.ReportAllocs()
   130  
   131  	var n datamodel.Node
   132  	var err error
   133  	for i := 0; i < b.N; i++ {
   134  		n, err = fluent.Reflect(basicnode.Prototype.Any, []interface{}{
   135  			map[string]interface{}{
   136  				"destination": "/",
   137  				"type":        "overlay",
   138  				"source":      "none",
   139  				"options": []string{
   140  					"lowerdir=/",
   141  					"upperdir=/tmp/overlay-root/upper",
   142  					"workdir=/tmp/overlay-root/work",
   143  				},
   144  			},
   145  		})
   146  	}
   147  	_ = n
   148  	if err != nil {
   149  		b.Fatal(err)
   150  	}
   151  }
   152  
   153  func BenchmarkAgonizinglyBare(b *testing.B) {
   154  	b.ReportAllocs()
   155  
   156  	var n datamodel.Node
   157  	var err error
   158  	for i := 0; i < b.N; i++ {
   159  		n, err = fab()
   160  	}
   161  	_ = n
   162  	if err != nil {
   163  		b.Fatal(err)
   164  	}
   165  }
   166  
   167  func fab() (datamodel.Node, error) {
   168  	nb := basicnode.Prototype.Any.NewBuilder()
   169  	la1, err := nb.BeginList(-1)
   170  	if err != nil {
   171  		return nil, err
   172  	}
   173  	ma, err := la1.AssembleValue().BeginMap(4)
   174  	if err != nil {
   175  		return nil, err
   176  	}
   177  	va, err := ma.AssembleEntry("destination")
   178  	if err != nil {
   179  		return nil, err
   180  	}
   181  	err = va.AssignString("/")
   182  	if err != nil {
   183  		return nil, err
   184  	}
   185  	va, err = ma.AssembleEntry("type")
   186  	if err != nil {
   187  		return nil, err
   188  	}
   189  	err = va.AssignString("overlay")
   190  	if err != nil {
   191  		return nil, err
   192  	}
   193  	va, err = ma.AssembleEntry("source")
   194  	if err != nil {
   195  		return nil, err
   196  	}
   197  	err = va.AssignString("none")
   198  	if err != nil {
   199  		return nil, err
   200  	}
   201  	va, err = ma.AssembleEntry("options")
   202  	if err != nil {
   203  		return nil, err
   204  	}
   205  	la2, err := va.BeginList(-4)
   206  	if err != nil {
   207  		return nil, err
   208  	}
   209  	err = la2.AssembleValue().AssignString("lowerdir=" + "/")
   210  	if err != nil {
   211  		return nil, err
   212  	}
   213  	err = la2.AssembleValue().AssignString("upperdir=" + "/tmp/overlay-root/upper")
   214  	if err != nil {
   215  		return nil, err
   216  	}
   217  	err = la2.AssembleValue().AssignString("workdir=" + "/tmp/overlay-root/work")
   218  	if err != nil {
   219  		return nil, err
   220  	}
   221  	err = la2.Finish()
   222  	if err != nil {
   223  		return nil, err
   224  	}
   225  	err = ma.Finish()
   226  	if err != nil {
   227  		return nil, err
   228  	}
   229  	err = la1.Finish()
   230  	if err != nil {
   231  		return nil, err
   232  	}
   233  	return nb.Build(), nil
   234  }