blob: 4fc5da19e51ebb19255bb82ebae85e562ce4b8cf [file] [log] [blame]
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// JSON benchmark marshals and unmarshals ~2MB json string
// with a tree-like object hierarchy, in 4*GOMAXPROCS goroutines.
package main
import (
"bytes"
"compress/bzip2"
"encoding/base64"
"encoding/json"
"io"
"golang.org/x/benchmarks/driver"
)
func main() {
driver.Main("JSON", benchmark)
}
func benchmark() driver.Result {
return driver.Benchmark(benchmarkN)
}
func benchmarkN(N uint64) {
driver.Parallel(N, 4, func() {
var r Response
if err := json.Unmarshal(jsonbytes, &r); err != nil {
panic(err)
}
if _, err := json.Marshal(&jsondata); err != nil {
panic(err)
}
})
}
var (
jsonbytes = makeBytes()
jsondata = makeData()
)
func makeBytes() []byte {
var r io.Reader
r = bytes.NewReader(bytes.Replace(jsonbz2_base64, []byte{'\n'}, nil, -1))
r = base64.NewDecoder(base64.StdEncoding, r)
r = bzip2.NewReader(r)
b, err := io.ReadAll(r)
if err != nil {
panic(err)
}
return b
}
func makeData() Response {
var v Response
if err := json.Unmarshal(jsonbytes, &v); err != nil {
panic(err)
}
return v
}
type Response struct {
Tree *Node `json:"tree"`
Username string `json:"username"`
}
type Node struct {
Name string `json:"name"`
Kids []*Node `json:"kids"`
CLWeight float64 `json:"cl_weight"`
Touches int `json:"touches"`
MinT int64 `json:"min_t"`
MaxT int64 `json:"max_t"`
MeanT int64 `json:"mean_t"`
}