|  | // 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 init() { | 
|  | 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() | 
|  | } | 
|  | } |