]> Cypherpunks repositories - gostls13.git/commit
runtime: avoid division in growslice
authorIlya Tocar <ilya.tocar@intel.com>
Fri, 23 Mar 2018 20:45:03 +0000 (15:45 -0500)
committerIlya Tocar <ilya.tocar@intel.com>
Fri, 13 Apr 2018 21:33:52 +0000 (21:33 +0000)
commite53cc7ae931eeec0863d066d98972fc52fcd09f0
tree31d6a5753e68fb262a9dc4a7c4b04e808b291dfb
parent70d83eda99d0687ba07348ca773ee8bf3e9bbfa9
runtime: avoid division in growslice

Add a special case for power-of-2 sized elements.
We can replace div/mul with left/right shift and avoid expensive operation.
growslice is hotter for short slices of small elements, such as int16, so
add an int16 version for GrowSlice benchmark.

name                   old time/op  new time/op  delta
GrowSlice/Byte-6       61.3ns ± 3%  60.5ns ± 4%  -1.33%  (p=0.002 n=30+30)
GrowSlice/Int16-6      94.0ns ± 4%  84.7ns ± 2%  -9.82%  (p=0.000 n=30+30)
GrowSlice/Int-6         100ns ± 1%    99ns ± 1%  -0.25%  (p=0.032 n=29+28)
GrowSlice/Ptr-6         197ns ± 2%   195ns ± 2%  -0.94%  (p=0.001 n=30+29)
GrowSlice/Struct/24-6   168ns ± 1%   166ns ± 2%  -1.09%  (p=0.000 n=25+30)
GrowSlice/Struct/32-6   187ns ± 2%   180ns ± 1%  -3.59%  (p=0.000 n=30+30)
GrowSlice/Struct/40-6   241ns ± 2%   238ns ± 2%  -1.41%  (p=0.000 n=30+30)

Change-Id: I31e8388d73fd9356e2dcc091d8d92eef3e3ccdbc
Reviewed-on: https://go-review.googlesource.com/102279
Run-TryBot: Ilya Tocar <ilya.tocar@intel.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/runtime/slice.go
src/runtime/slice_test.go