summaryrefslogtreecommitdiff
path: root/test/bench/go1/gob_test.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2011-12-15 12:32:59 -0500
committerRuss Cox <rsc@golang.org>2011-12-15 12:32:59 -0500
commit5d67f23c91efb5d9b736d93f2e43107f1265f5b2 (patch)
tree375c975ee95b4b3dc350ea66b4832209199db8be /test/bench/go1/gob_test.go
parenta28969a9371432c7858d04f2eb8cbfea41cae0c8 (diff)
downloadgo-5d67f23c91efb5d9b736d93f2e43107f1265f5b2.tar.gz
test/bench/go1: first draft of Go 1 benchmark suite
I have included a few important microbenchmarks, but the overall intent is to have mostly end-to-end benchmarks timing real world operations. The jsondata.go file is a summary of agl's activity in various open source repositories. It gets used as test data for many of the benchmarks. Everything links into one binary (even the test data) so that it is easy to run the benchmarks on many computers: there is just one file to copy around. R=golang-dev, r, bradfitz, adg, r CC=golang-dev http://codereview.appspot.com/5484071
Diffstat (limited to 'test/bench/go1/gob_test.go')
-rw-r--r--test/bench/go1/gob_test.go95
1 files changed, 95 insertions, 0 deletions
diff --git a/test/bench/go1/gob_test.go b/test/bench/go1/gob_test.go
new file mode 100644
index 000000000..00eeed57a
--- /dev/null
+++ b/test/bench/go1/gob_test.go
@@ -0,0 +1,95 @@
+// Copyright 2011 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.
+
+// This benchmark tests gob encoding and decoding performance.
+
+package go1
+
+import (
+ "bytes"
+ "encoding/gob"
+ "encoding/json"
+ "io/ioutil"
+ "log"
+ "reflect"
+ "testing"
+)
+
+var (
+ gobbytes []byte
+ gobdata *JSONResponse
+)
+
+func gobinit() {
+ // gobinit is called after json's init,
+ // because it uses jsondata.
+ gobdata = gobResponse(&jsondata)
+
+ var buf bytes.Buffer
+ if err := gob.NewEncoder(&buf).Encode(gobdata); err != nil {
+ panic(err)
+ }
+ gobbytes = buf.Bytes()
+
+ var r JSONResponse
+ if err := gob.NewDecoder(bytes.NewBuffer(gobbytes)).Decode(&r); err != nil {
+ panic(err)
+ }
+ if !reflect.DeepEqual(gobdata, &r) {
+ log.Printf("%v\n%v", jsondata, r)
+ b, _ := json.Marshal(&jsondata)
+ br, _ := json.Marshal(&r)
+ log.Printf("%s\n%s\n", b, br)
+ panic("gob: encode+decode lost data")
+ }
+}
+
+// gob turns [] into null, so make a copy of the data structure like that
+func gobResponse(r *JSONResponse) *JSONResponse {
+ return &JSONResponse{gobNode(r.Tree), r.Username}
+}
+
+func gobNode(n *JSONNode) *JSONNode {
+ n1 := new(JSONNode)
+ *n1 = *n
+ if len(n1.Kids) == 0 {
+ n1.Kids = nil
+ } else {
+ for i, k := range n1.Kids {
+ n1.Kids[i] = gobNode(k)
+ }
+ }
+ return n1
+}
+
+func gobdec() {
+ if gobbytes == nil {
+ panic("gobdata not initialized")
+ }
+ var r JSONResponse
+ if err := gob.NewDecoder(bytes.NewBuffer(gobbytes)).Decode(&r); err != nil {
+ panic(err)
+ }
+ _ = r
+}
+
+func gobenc() {
+ if err := gob.NewEncoder(ioutil.Discard).Encode(&gobdata); err != nil {
+ panic(err)
+ }
+}
+
+func BenchmarkGobDecode(b *testing.B) {
+ b.SetBytes(int64(len(gobbytes)))
+ for i := 0; i < b.N; i++ {
+ gobdec()
+ }
+}
+
+func BenchmarkGobEncode(b *testing.B) {
+ b.SetBytes(int64(len(gobbytes)))
+ for i := 0; i < b.N; i++ {
+ gobenc()
+ }
+}