github.com/intel-go/fastjson@v0.0.0-20170329170629-f846ae58a1ab/bench_test.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Large data benchmark.
     6  // The JSON data is a summary of agl's changes in the
     7  // go, webkit, and chromium open source projects.
     8  // We benchmark converting between the JSON form
     9  // and in-memory data structures.
    10  
    11  package fastjson
    12  
    13  import (
    14  	"bytes"
    15  	"compress/gzip"
    16  	"io/ioutil"
    17  	"os"
    18  	"strings"
    19  	"testing"
    20  )
    21  
    22  type codeResponse struct {
    23  	Tree     *codeNode `json:"tree"`
    24  	Username string    `json:"username"`
    25  }
    26  
    27  type codeNode struct {
    28  	Name     string      `json:"name"`
    29  	Kids     []*codeNode `json:"kids"`
    30  	CLWeight float64     `json:"cl_weight"`
    31  	Touches  int         `json:"touches"`
    32  	MinT     int64       `json:"min_t"`
    33  	MaxT     int64       `json:"max_t"`
    34  	MeanT    int64       `json:"mean_t"`
    35  }
    36  
    37  var testData [][]byte
    38  var codeJSON []byte
    39  var codeStruct codeResponse
    40  var fileNames = [...]string{"testdata/canada.json.gz",
    41  	"testdata/code.json.gz",
    42  	"testdata/large-dict.json.gz",
    43  	"testdata/medium-dict.json.gz"}
    44  
    45  func codeInit() {
    46  	f, err := os.Open("testdata/code.json.gz")
    47  	if err != nil {
    48  		panic(err)
    49  	}
    50  	defer f.Close()
    51  	gz, err := gzip.NewReader(f)
    52  	if err != nil {
    53  		panic(err)
    54  	}
    55  	data, err := ioutil.ReadAll(gz)
    56  	if err != nil {
    57  		panic(err)
    58  	}
    59  
    60  	codeJSON = data
    61  
    62  	if err := Unmarshal(codeJSON, &codeStruct); err != nil {
    63  		panic("unmarshal code.json: " + err.Error())
    64  	}
    65  
    66  	if data, err = Marshal(&codeStruct); err != nil {
    67  		panic("marshal code.json: " + err.Error())
    68  	}
    69  
    70  	if !bytes.Equal(data, codeJSON) {
    71  		println("different lengths", len(data), len(codeJSON))
    72  		for i := 0; i < len(data) && i < len(codeJSON); i++ {
    73  			if data[i] != codeJSON[i] {
    74  				println("re-marshal: changed at byte", i)
    75  				println("orig: ", string(codeJSON[i-10:i+10]))
    76  				println("new: ", string(data[i-10:i+10]))
    77  				break
    78  			}
    79  		}
    80  		panic("re-marshal code.json: different result")
    81  	}
    82  	testData = make([][]byte, len(fileNames))
    83  
    84  	for i, name := range fileNames {
    85  		f, err = os.Open(name)
    86  		if err != nil {
    87  			panic(err)
    88  		}
    89  		defer f.Close()
    90  		gz, err = gzip.NewReader(f)
    91  		if err != nil {
    92  			panic(err)
    93  		}
    94  		testData[i], err = ioutil.ReadAll(gz)
    95  		if err != nil {
    96  			panic(err)
    97  		}
    98  		var jsonObj interface{}
    99  		if err = Unmarshal(testData[i], &jsonObj); err != nil {
   100  			panic("unmarshal code.json: " + err.Error())
   101  		}
   102  	}
   103  
   104  }
   105  
   106  func BenchmarkCodeEncoder(b *testing.B) {
   107  	if codeJSON == nil {
   108  		b.StopTimer()
   109  		codeInit()
   110  		b.StartTimer()
   111  	}
   112  	enc := NewEncoder(ioutil.Discard)
   113  	for i := 0; i < b.N; i++ {
   114  		if err := enc.Encode(&codeStruct); err != nil {
   115  			b.Fatal("Encode:", err)
   116  		}
   117  	}
   118  	b.SetBytes(int64(len(codeJSON)))
   119  }
   120  
   121  func BenchmarkCodeMarshal(b *testing.B) {
   122  	if codeJSON == nil {
   123  		b.StopTimer()
   124  		codeInit()
   125  		b.StartTimer()
   126  	}
   127  	for i := 0; i < b.N; i++ {
   128  		if _, err := Marshal(&codeStruct); err != nil {
   129  			b.Fatal("Marshal:", err)
   130  		}
   131  	}
   132  	b.SetBytes(int64(len(codeJSON)))
   133  }
   134  
   135  func BenchmarkCodeDecoder(b *testing.B) {
   136  	if codeJSON == nil {
   137  		b.StopTimer()
   138  		codeInit()
   139  		b.StartTimer()
   140  	}
   141  	var buf bytes.Buffer
   142  	dec := NewDecoder(&buf)
   143  	var r codeResponse
   144  	for i := 0; i < b.N; i++ {
   145  		buf.Write(codeJSON)
   146  		// hide EOF
   147  		buf.WriteByte('\n')
   148  		buf.WriteByte('\n')
   149  		buf.WriteByte('\n')
   150  		if err := dec.Decode(&r); err != nil {
   151  			b.Fatal("Decode:", err)
   152  		}
   153  	}
   154  	b.SetBytes(int64(len(codeJSON)))
   155  }
   156  
   157  func BenchmarkDecoderStream(b *testing.B) {
   158  	b.StopTimer()
   159  	var buf bytes.Buffer
   160  	dec := NewDecoder(&buf)
   161  	buf.WriteString(`"` + strings.Repeat("x", 1000000) + `"` + "\n\n\n")
   162  	var x interface{}
   163  	if err := dec.Decode(&x); err != nil {
   164  		b.Fatal("Decode:", err)
   165  	}
   166  	ones := strings.Repeat(" 1\n", 300000) + "\n\n\n"
   167  	b.StartTimer()
   168  	for i := 0; i < b.N; i++ {
   169  		if i%300000 == 0 {
   170  			buf.WriteString(ones)
   171  		}
   172  		x = nil
   173  		if err := dec.Decode(&x); err != nil || x != 1.0 {
   174  			b.Fatalf("Decode: %v after %d", err, i)
   175  		}
   176  	}
   177  }
   178  
   179  func BenchmarkCodeUnmarshal(b *testing.B) {
   180  	if codeJSON == nil {
   181  		b.StopTimer()
   182  		codeInit()
   183  		b.StartTimer()
   184  	}
   185  	for i := 0; i < b.N; i++ {
   186  		var r codeResponse
   187  		if err := Unmarshal(codeJSON, &r); err != nil {
   188  			b.Fatal("Unmarshal:", err)
   189  		}
   190  	}
   191  	b.SetBytes(int64(len(codeJSON)))
   192  }
   193  
   194  func BenchmarkCodeUnmarshalReuse(b *testing.B) {
   195  	if codeJSON == nil {
   196  		b.StopTimer()
   197  		codeInit()
   198  		b.StartTimer()
   199  	}
   200  	var r codeResponse
   201  	for i := 0; i < b.N; i++ {
   202  		if err := Unmarshal(codeJSON, &r); err != nil {
   203  			b.Fatal("Unmarshal:", err)
   204  		}
   205  	}
   206  }
   207  
   208  func BenchmarkCodeUnmarshalManyNumbers(b *testing.B) {
   209  	if codeJSON == nil {
   210  		b.StopTimer()
   211  		codeInit()
   212  		b.StartTimer()
   213  	}
   214  	for i := 0; i < b.N; i++ {
   215  		var r interface{}
   216  		if err := Unmarshal(testData[0], &r); err != nil {
   217  			b.Fatal("Unmarshal:", err)
   218  		}
   219  	}
   220  	b.SetBytes(int64(len(testData[0])))
   221  }
   222  
   223  func BenchmarkCodeUnmarshalNoReflect(b *testing.B) {
   224  	if codeJSON == nil {
   225  		b.StopTimer()
   226  		codeInit()
   227  		b.StartTimer()
   228  	}
   229  	for i := 0; i < b.N; i++ {
   230  		var r interface{}
   231  		if err := Unmarshal(testData[1], &r); err != nil {
   232  			b.Fatal("Unmarshal:", err)
   233  		}
   234  	}
   235  	b.SetBytes(int64(len(testData[1])))
   236  }
   237  
   238  func BenchmarkCodeUnmarshalLargeFile(b *testing.B) {
   239  	if codeJSON == nil {
   240  		b.StopTimer()
   241  		codeInit()
   242  		b.StartTimer()
   243  	}
   244  	for i := 0; i < b.N; i++ {
   245  		var r interface{}
   246  		if err := Unmarshal(testData[2], &r); err != nil {
   247  			b.Fatal("Unmarshal:", err)
   248  		}
   249  	}
   250  	b.SetBytes(int64(len(testData[2])))
   251  }
   252  
   253  func BenchmarkCodeUnmarshalMediumFile(b *testing.B) {
   254  	if codeJSON == nil {
   255  		b.StopTimer()
   256  		codeInit()
   257  		b.StartTimer()
   258  	}
   259  	for i := 0; i < b.N; i++ {
   260  		var r interface{}
   261  		if err := Unmarshal(testData[3], &r); err != nil {
   262  			b.Fatal("Unmarshal:", err)
   263  		}
   264  	}
   265  	b.SetBytes(int64(len(testData[3])))
   266  }
   267  
   268  func BenchmarkUnmarshalString(b *testing.B) {
   269  	data := []byte(`"hello, world"`)
   270  	var s string
   271  
   272  	for i := 0; i < b.N; i++ {
   273  		if err := Unmarshal(data, &s); err != nil {
   274  			b.Fatal("Unmarshal:", err)
   275  		}
   276  	}
   277  }
   278  
   279  func BenchmarkUnmarshalFloat64(b *testing.B) {
   280  	var f float64
   281  	data := []byte(`3.14`)
   282  
   283  	for i := 0; i < b.N; i++ {
   284  		if err := Unmarshal(data, &f); err != nil {
   285  			b.Fatal("Unmarshal:", err)
   286  		}
   287  	}
   288  }
   289  
   290  func BenchmarkUnmarshalInt64(b *testing.B) {
   291  	var x int64
   292  	data := []byte(`3`)
   293  
   294  	for i := 0; i < b.N; i++ {
   295  		if err := Unmarshal(data, &x); err != nil {
   296  			b.Fatal("Unmarshal:", err)
   297  		}
   298  	}
   299  }
   300  
   301  func BenchmarkIssue10335(b *testing.B) {
   302  	b.ReportAllocs()
   303  	var s struct{}
   304  	j := []byte(`{"a":{ }}`)
   305  	for n := 0; n < b.N; n++ {
   306  		if err := Unmarshal(j, &s); err != nil {
   307  			b.Fatal(err)
   308  		}
   309  	}
   310  }