f038dae646
From-SVN: r204466
110 lines
2.2 KiB
Go
110 lines
2.2 KiB
Go
// 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.
|
|
|
|
package gob
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"os"
|
|
"runtime"
|
|
"testing"
|
|
)
|
|
|
|
type Bench struct {
|
|
A int
|
|
B float64
|
|
C string
|
|
D []byte
|
|
}
|
|
|
|
func benchmarkEndToEnd(r io.Reader, w io.Writer, b *testing.B) {
|
|
b.StopTimer()
|
|
enc := NewEncoder(w)
|
|
dec := NewDecoder(r)
|
|
bench := &Bench{7, 3.2, "now is the time", []byte("for all good men")}
|
|
b.StartTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
if enc.Encode(bench) != nil {
|
|
panic("encode error")
|
|
}
|
|
if dec.Decode(bench) != nil {
|
|
panic("decode error")
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkEndToEndPipe(b *testing.B) {
|
|
r, w, err := os.Pipe()
|
|
if err != nil {
|
|
b.Fatal("can't get pipe:", err)
|
|
}
|
|
benchmarkEndToEnd(r, w, b)
|
|
}
|
|
|
|
func BenchmarkEndToEndByteBuffer(b *testing.B) {
|
|
var buf bytes.Buffer
|
|
benchmarkEndToEnd(&buf, &buf, b)
|
|
}
|
|
|
|
func TestCountEncodeMallocs(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping malloc count in short mode")
|
|
}
|
|
if runtime.GOMAXPROCS(0) > 1 {
|
|
t.Skip("skipping; GOMAXPROCS>1")
|
|
}
|
|
|
|
const N = 1000
|
|
|
|
var buf bytes.Buffer
|
|
enc := NewEncoder(&buf)
|
|
bench := &Bench{7, 3.2, "now is the time", []byte("for all good men")}
|
|
|
|
allocs := testing.AllocsPerRun(N, func() {
|
|
err := enc.Encode(bench)
|
|
if err != nil {
|
|
t.Fatal("encode:", err)
|
|
}
|
|
})
|
|
if allocs != 0 {
|
|
t.Fatalf("mallocs per encode of type Bench: %v; wanted 0\n", allocs)
|
|
}
|
|
}
|
|
|
|
func TestCountDecodeMallocs(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping malloc count in short mode")
|
|
}
|
|
if runtime.GOMAXPROCS(0) > 1 {
|
|
t.Skip("skipping; GOMAXPROCS>1")
|
|
}
|
|
|
|
const N = 1000
|
|
|
|
var buf bytes.Buffer
|
|
enc := NewEncoder(&buf)
|
|
bench := &Bench{7, 3.2, "now is the time", []byte("for all good men")}
|
|
|
|
// Fill the buffer with enough to decode
|
|
testing.AllocsPerRun(N, func() {
|
|
err := enc.Encode(bench)
|
|
if err != nil {
|
|
t.Fatal("encode:", err)
|
|
}
|
|
})
|
|
|
|
dec := NewDecoder(&buf)
|
|
allocs := testing.AllocsPerRun(N, func() {
|
|
*bench = Bench{}
|
|
err := dec.Decode(&bench)
|
|
if err != nil {
|
|
t.Fatal("decode:", err)
|
|
}
|
|
})
|
|
if allocs != 3 {
|
|
t.Fatalf("mallocs per decode of type Bench: %v; wanted 3\n", allocs)
|
|
}
|
|
}
|