diff options
| author | Dmitriy Vyukov <dvyukov@google.com> | 2014-08-08 12:48:34 +0400 |
|---|---|---|
| committer | Dmitriy Vyukov <dvyukov@google.com> | 2014-08-08 12:48:34 +0400 |
| commit | f7832df7695c1e5930b2c8ed5e02d529d00f21a4 (patch) | |
| tree | c7a004bc7f707d332fc2d9b5a88bc79eb25645ab /src/pkg/encoding | |
| parent | 21f7d83ffd3633869e9861efbe99f035daeb2201 (diff) | |
| download | go-f7832df7695c1e5930b2c8ed5e02d529d00f21a4.tar.xz | |
encoding/gob: fix data races in benchmarks
All goroutines decode into the same value.
LGTM=r
R=r, abursavich
CC=golang-codereviews
https://golang.org/cl/123930043
Diffstat (limited to 'src/pkg/encoding')
| -rw-r--r-- | src/pkg/encoding/gob/timing_test.go | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/src/pkg/encoding/gob/timing_test.go b/src/pkg/encoding/gob/timing_test.go index 29c9b858b6..ec55c4d63d 100644 --- a/src/pkg/encoding/gob/timing_test.go +++ b/src/pkg/encoding/gob/timing_test.go @@ -19,12 +19,13 @@ type Bench struct { D []byte } -func benchmarkEndToEnd(b *testing.B, v interface{}, pipe func() (r io.Reader, w io.Writer, err error)) { +func benchmarkEndToEnd(b *testing.B, ctor func() interface{}, pipe func() (r io.Reader, w io.Writer, err error)) { b.RunParallel(func(pb *testing.PB) { r, w, err := pipe() if err != nil { b.Fatal("can't get pipe:", err) } + v := ctor() enc := NewEncoder(w) dec := NewDecoder(r) for pb.Next() { @@ -39,29 +40,33 @@ func benchmarkEndToEnd(b *testing.B, v interface{}, pipe func() (r io.Reader, w } func BenchmarkEndToEndPipe(b *testing.B) { - v := &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)} - benchmarkEndToEnd(b, v, func() (r io.Reader, w io.Writer, err error) { + benchmarkEndToEnd(b, func() interface{} { + return &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)} + }, func() (r io.Reader, w io.Writer, err error) { r, w, err = os.Pipe() return }) } func BenchmarkEndToEndByteBuffer(b *testing.B) { - v := &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)} - benchmarkEndToEnd(b, v, func() (r io.Reader, w io.Writer, err error) { + benchmarkEndToEnd(b, func() interface{} { + return &Bench{7, 3.2, "now is the time", bytes.Repeat([]byte("for all good men"), 100)} + }, func() (r io.Reader, w io.Writer, err error) { var buf bytes.Buffer return &buf, &buf, nil }) } func BenchmarkEndToEndSliceByteBuffer(b *testing.B) { - v := &Bench{7, 3.2, "now is the time", nil} - Register(v) - arr := make([]interface{}, 100) - for i := range arr { - arr[i] = v - } - benchmarkEndToEnd(b, &arr, func() (r io.Reader, w io.Writer, err error) { + benchmarkEndToEnd(b, func() interface{} { + v := &Bench{7, 3.2, "now is the time", nil} + Register(v) + arr := make([]interface{}, 100) + for i := range arr { + arr[i] = v + } + return &arr + }, func() (r io.Reader, w io.Writer, err error) { var buf bytes.Buffer return &buf, &buf, nil }) |
