...
Run Format

Source file test/bench/go1/gob_test.go

Documentation: test/bench/go1

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

View as plain text