summaryrefslogtreecommitdiffstats
path: root/test/bench/go1/gob_test.go
diff options
context:
space:
mode:
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 0000000..9fc1677
--- /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"
+ "log"
+ "reflect"
+ "testing"
+)
+
+func makeGob(jsondata *JSONResponse) (data *JSONResponse, b []byte) {
+ data = gobResponse(jsondata)
+
+ var buf bytes.Buffer
+ if err := gob.NewEncoder(&buf).Encode(data); err != nil {
+ panic(err)
+ }
+ b = buf.Bytes()
+
+ var r JSONResponse
+ if err := gob.NewDecoder(bytes.NewBuffer(b)).Decode(&r); err != nil {
+ panic(err)
+ }
+ if !reflect.DeepEqual(data, &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")
+ }
+
+ return
+}
+
+// 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(b []byte) {
+ var r JSONResponse
+ if err := gob.NewDecoder(bytes.NewBuffer(b)).Decode(&r); err != nil {
+ panic(err)
+ }
+ _ = r
+}
+
+func gobenc(data *JSONResponse) {
+ if err := gob.NewEncoder(io.Discard).Encode(data); err != nil {
+ panic(err)
+ }
+}
+
+func BenchmarkGobDecode(b *testing.B) {
+ jsonbytes := makeJsonBytes()
+ jsondata := makeJsonData(jsonbytes)
+ _, bytes := makeGob(jsondata)
+ b.ResetTimer()
+ b.SetBytes(int64(len(bytes)))
+ for i := 0; i < b.N; i++ {
+ gobdec(bytes)
+ }
+}
+
+func BenchmarkGobEncode(b *testing.B) {
+ jsonbytes := makeJsonBytes()
+ jsondata := makeJsonData(jsonbytes)
+ data, bytes := makeGob(jsondata)
+ b.ResetTimer()
+ b.SetBytes(int64(len(bytes)))
+ for i := 0; i < b.N; i++ {
+ gobenc(data)
+ }
+}