package pool
import (
"compress/flate"
"runtime"
"sync"
"testing"
)
func Benchmark(b *testing.B) {
b.ReportAllocs()
var a, z [1000]*flate.Writer
p := sync.Pool{New: func() interface{} { return &flate.Writer{} }}
for i := 0; i < b.N; i++ {
for j := 0; j < len(a); j++ {
a[j] = p.Get().(*flate.Writer)
}
for j := 0; j < len(a); j++ {
p.Put(a[j])
}
a = z
runtime.GC()
}
}
go version go1.14 darwin/amd64:
goos: darwin
goarch: amd64
pkg: test/pool
Benchmark-8 9 125374864 ns/op 74336471 B/op 130 allocs/op
PASS
ok test/pool 1.832s
go version go1.12 darwin/amd64:
goos: darwin
goarch: amd64
pkg: test/pool
Benchmark-8 10 237238662 ns/op 663593951 B/op 1029 allocs/op
PASS
ok test/pool 2.914s
1.共享部分的无锁设计(转用atomic)
2.victim cache的设计
确实有效,解决了之前实操中大量GC导致pool不断被清空,反而成为性能负担的问题。