gitee.com/quant1x/gox@v1.7.6/fastjson/arena_timing_test.go (about)

     1  package fastjson
     2  
     3  import (
     4  	"sync/atomic"
     5  	"testing"
     6  )
     7  
     8  func BenchmarkArenaTypicalUse(b *testing.B) {
     9  	// Determine the length of created object
    10  	var aa Arena
    11  	obj := benchCreateArenaObject(&aa)
    12  	objLen := len(obj.String())
    13  	b.SetBytes(int64(objLen))
    14  	b.ReportAllocs()
    15  	b.RunParallel(func(pb *testing.PB) {
    16  		var buf []byte
    17  		var a Arena
    18  		var sink int
    19  		for pb.Next() {
    20  			obj := benchCreateArenaObject(&a)
    21  			buf = obj.MarshalTo(buf[:0])
    22  			a.Reset()
    23  			sink += len(buf)
    24  		}
    25  		atomic.AddUint64(&Sink, uint64(sink))
    26  	})
    27  }
    28  
    29  func benchCreateArenaObject(a *Arena) *Value {
    30  	o := a.NewObject()
    31  	o.Set("key1", a.NewNumberInt(123))
    32  	o.Set("key2", a.NewNumberFloat64(-1.23))
    33  
    34  	// Create a string only once and use multuple times as a performance optimization.
    35  	s := a.NewString("foobar")
    36  	aa := a.NewArray()
    37  	for i := 0; i < 10; i++ {
    38  		aa.SetArrayItem(i, s)
    39  	}
    40  	o.Set("key3", aa)
    41  	return o
    42  }