]> Cypherpunks repositories - gostls13.git/commitdiff
sync: improve Pool performance
authorAliaksandr Valialkin <valyala@gmail.com>
Mon, 17 Apr 2017 12:09:10 +0000 (15:09 +0300)
committerIan Lance Taylor <iant@golang.org>
Tue, 18 Apr 2017 14:17:48 +0000 (14:17 +0000)
Rewrite indexLocal to achieve higher performance.

Performance results on linux/amd64:

name            old time/op  new time/op  delta
Pool-4          19.1ns ± 2%  10.1ns ± 1%  -47.15%  (p=0.000 n=10+8)
PoolOverflow-4  3.11µs ± 1%  2.10µs ± 2%  -32.66%  (p=0.000 n=10+10)

Performance results on linux/386:

name            old time/op  new time/op  delta
Pool-4          20.0ns ± 2%  13.1ns ± 1%  -34.59%  (p=0.000 n=10+9)
PoolOverflow-4  3.51µs ± 1%  2.49µs ± 0%  -28.99%  (p=0.000 n=10+8)

Change-Id: I7d57a2d4cd47ec43d09ca1267bde2e3f05a9faa9
Reviewed-on: https://go-review.googlesource.com/40913
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/sync/pool.go

index 0acdbde096f07dc1b89b244dbd3e6b9ff4389e15..b3fd9d397c538a8f224b51f681c33ab3ce38479f 100644 (file)
@@ -241,7 +241,8 @@ func init() {
 }
 
 func indexLocal(l unsafe.Pointer, i int) *poolLocal {
-       return &(*[1000000]poolLocal)(l)[i]
+       lp := unsafe.Pointer(uintptr(l) + uintptr(i)*unsafe.Sizeof(poolLocal{}))
+       return (*poolLocal)(lp)
 }
 
 // Implemented in runtime.