Martin Möhrmann
8c4170b2c9
math/bits: move tests into their own package
...
This makes math/bits not have any explicit imports even
when compiling tests and thereby avoids import cycles when
dependencies of testing want to import math/bits.
Change-Id: I95eccae2f5c4310e9b18124abfa85212dfbd9daa
Reviewed-on: https://go-review.googlesource.com/110479
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2018-05-01 15:33:01 +00:00
Lynn Boger
8304d10763
cmd/compile: ppc64x intrinsics for math/bits
...
This adds math/bits intrinsics for OnesCount, Len, TrailingZeros on
ppc64x.
benchmark old ns/op new ns/op delta
BenchmarkLeadingZeros-16 4.26 1.71 -59.86%
BenchmarkLeadingZeros16-16 3.04 1.83 -39.80%
BenchmarkLeadingZeros32-16 3.31 1.82 -45.02%
BenchmarkLeadingZeros64-16 3.69 1.71 -53.66%
BenchmarkTrailingZeros-16 2.55 1.62 -36.47%
BenchmarkTrailingZeros32-16 2.55 1.77 -30.59%
BenchmarkTrailingZeros64-16 2.78 1.62 -41.73%
BenchmarkOnesCount-16 3.19 0.93 -70.85%
BenchmarkOnesCount32-16 2.55 1.18 -53.73%
BenchmarkOnesCount64-16 3.22 0.93 -71.12%
Update #18616
I also made a change to bits_test.go because when debugging some failures
the output was not quite providing the right argument information.
Change-Id: Ia58d31d1777cf4582a4505f85b11a1202ca07d3e
Reviewed-on: https://go-review.googlesource.com/41630
Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Carlos Eduardo Seo <cseo@linux.vnet.ibm.com>
Reviewed-by: Keith Randall <khr@golang.org>
2017-05-10 12:10:56 +00:00
Robert Griesemer
9d01def597
math/bits: support negative rotation count and remove RotateRight
...
For details see the discussion on the issue below.
RotateLeft functions can now be inlined because the don't panic
anymore for negative rotation counts.
name old time/op new time/op delta
RotateLeft-8 6.72ns ± 2% 1.86ns ± 0% -72.33% (p=0.016 n=5+4)
RotateLeft8-8 4.41ns ± 2% 1.67ns ± 1% -62.15% (p=0.008 n=5+5)
RotateLeft16-8 4.46ns ± 6% 1.65ns ± 0% -63.06% (p=0.008 n=5+5)
RotateLeft32-8 4.50ns ± 5% 1.67ns ± 1% -62.86% (p=0.008 n=5+5)
RotateLeft64-8 4.54ns ± 1% 1.85ns ± 1% -59.32% (p=0.008 n=5+5)
https://perf.golang.org/search?q=upload:20170411.4
(Measured on 2.3 GHz Intel Core i7 running macOS 10.12.3.)
For #18616 .
Change-Id: I0828d80d54ec24f8d44954a57b3d6aeedb69c686
Reviewed-on: https://go-review.googlesource.com/40394
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2017-04-11 23:57:24 +00:00
Robert Griesemer
177dfba112
math/bits: faster OnesCount
...
Using some additional suggestions per "Hacker's Delight".
Added documentation and extra tests.
Measured on 1.7 GHz Intel Core i7, running macOS 10.12.3.
benchmark old ns/op new ns/op delta
BenchmarkOnesCount-4 7.34 5.38 -26.70%
BenchmarkOnesCount8-4 2.03 1.98 -2.46%
BenchmarkOnesCount16-4 2.56 2.50 -2.34%
BenchmarkOnesCount32-4 2.98 2.39 -19.80%
BenchmarkOnesCount64-4 4.22 2.96 -29.86%
Change-Id: I566b0ef766e55cf5776b1662b6016024ebe5d878
Reviewed-on: https://go-review.googlesource.com/37223
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
2017-02-19 18:50:48 +00:00
Robert Griesemer
a4a3d63dbe
math/bits: added benchmarks for Leading/TrailingZeros
...
BenchmarkLeadingZeros-8 200000000 8.80 ns/op
BenchmarkLeadingZeros8-8 200000000 8.21 ns/op
BenchmarkLeadingZeros16-8 200000000 7.49 ns/op
BenchmarkLeadingZeros32-8 200000000 7.80 ns/op
BenchmarkLeadingZeros64-8 200000000 8.67 ns/op
BenchmarkTrailingZeros-8 1000000000 2.05 ns/op
BenchmarkTrailingZeros8-8 2000000000 1.94 ns/op
BenchmarkTrailingZeros16-8 2000000000 1.94 ns/op
BenchmarkTrailingZeros32-8 2000000000 1.92 ns/op
BenchmarkTrailingZeros64-8 2000000000 2.03 ns/op
Change-Id: I45497bf2d6369ba6cfc88ded05aa735908af8908
Reviewed-on: https://go-review.googlesource.com/37220
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2017-02-17 23:41:16 +00:00
Robert Griesemer
19028bdd18
math/bits: faster Rotate functions, added respective benchmarks
...
Measured on 2.3 GHz Intel Core i7, running maxOS 10.12.3.
benchmark old ns/op new ns/op delta
BenchmarkRotateLeft-8 7.87 7.00 -11.05%
BenchmarkRotateLeft8-8 8.41 4.52 -46.25%
BenchmarkRotateLeft16-8 8.07 4.55 -43.62%
BenchmarkRotateLeft32-8 8.36 4.73 -43.42%
BenchmarkRotateLeft64-8 7.93 4.78 -39.72%
BenchmarkRotateRight-8 8.23 6.72 -18.35%
BenchmarkRotateRight8-8 8.76 4.39 -49.89%
BenchmarkRotateRight16-8 9.07 4.44 -51.05%
BenchmarkRotateRight32-8 8.85 4.46 -49.60%
BenchmarkRotateRight64-8 8.11 4.43 -45.38%
Change-Id: I79ea1e9e6fc65f95794a91f860a911efed3aa8a1
Reviewed-on: https://go-review.googlesource.com/37219
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2017-02-17 23:40:45 +00:00
Robert Griesemer
a12edb8db6
math/bits: faster OnesCount, added respective benchmarks
...
Also: Changed Reverse/ReverseBytes implementations to use
the same (smaller) masks as OnesCount.
BenchmarkOnesCount-8 37.0 6.26 -83.08%
BenchmarkOnesCount8-8 7.24 1.99 -72.51%
BenchmarkOnesCount16-8 11.3 2.47 -78.14%
BenchmarkOnesCount32-8 18.4 3.02 -83.59%
BenchmarkOnesCount64-8 40.0 3.78 -90.55%
BenchmarkReverse-8 6.69 6.22 -7.03%
BenchmarkReverse8-8 1.64 1.64 +0.00%
BenchmarkReverse16-8 2.26 2.18 -3.54%
BenchmarkReverse32-8 2.88 2.87 -0.35%
BenchmarkReverse64-8 5.64 4.34 -23.05%
BenchmarkReverseBytes-8 2.48 2.17 -12.50%
BenchmarkReverseBytes16-8 0.63 0.95 +50.79%
BenchmarkReverseBytes32-8 1.13 1.24 +9.73%
BenchmarkReverseBytes64-8 2.50 2.16 -13.60%
OnesCount-8 37.0ns ± 0% 6.3ns ± 0% ~ (p=1.000 n=1+1)
OnesCount8-8 7.24ns ± 0% 1.99ns ± 0% ~ (p=1.000 n=1+1)
OnesCount16-8 11.3ns ± 0% 2.5ns ± 0% ~ (p=1.000 n=1+1)
OnesCount32-8 18.4ns ± 0% 3.0ns ± 0% ~ (p=1.000 n=1+1)
OnesCount64-8 40.0ns ± 0% 3.8ns ± 0% ~ (p=1.000 n=1+1)
Reverse-8 6.69ns ± 0% 6.22ns ± 0% ~ (p=1.000 n=1+1)
Reverse8-8 1.64ns ± 0% 1.64ns ± 0% ~ (all samples are equal)
Reverse16-8 2.26ns ± 0% 2.18ns ± 0% ~ (p=1.000 n=1+1)
Reverse32-8 2.88ns ± 0% 2.87ns ± 0% ~ (p=1.000 n=1+1)
Reverse64-8 5.64ns ± 0% 4.34ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes-8 2.48ns ± 0% 2.17ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes16-8 0.63ns ± 0% 0.95ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes32-8 1.13ns ± 0% 1.24ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes64-8 2.50ns ± 0% 2.16ns ± 0% ~ (p=1.000 n=1+1)
Change-Id: I591b0ffc83fc3a42828256b6e5030f32c64f9497
Reviewed-on: https://go-review.googlesource.com/37218
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2017-02-17 23:40:10 +00:00
Robert Griesemer
3a239a6ae4
math/bits: fix benchmarks (make sure calls don't get optimized away)
...
Sum up function results and store them in an exported (global)
variable. This prevents the compiler from optimizing away the
otherwise side-effect free function calls.
We now have more realistic set of benchmark numbers...
Measured on 2.3 GHz Intel Core i7, running maxOS 10.12.3.
Note: These measurements are based on the same "old"
implementation as the prior measurements (commit 7d5c003 ).
benchmark old ns/op new ns/op delta
BenchmarkReverse-8 72.9 8.50 -88.34%
BenchmarkReverse8-8 13.2 2.17 -83.56%
BenchmarkReverse16-8 21.2 2.89 -86.37%
BenchmarkReverse32-8 36.3 3.55 -90.22%
BenchmarkReverse64-8 71.3 6.81 -90.45%
BenchmarkReverseBytes-8 11.2 3.49 -68.84%
BenchmarkReverseBytes16-8 6.24 0.93 -85.10%
BenchmarkReverseBytes32-8 7.40 1.55 -79.05%
BenchmarkReverseBytes64-8 10.5 2.47 -76.48%
Reverse-8 72.9ns ± 0% 8.5ns ± 0% ~ (p=1.000 n=1+1)
Reverse8-8 13.2ns ± 0% 2.2ns ± 0% ~ (p=1.000 n=1+1)
Reverse16-8 21.2ns ± 0% 2.9ns ± 0% ~ (p=1.000 n=1+1)
Reverse32-8 36.3ns ± 0% 3.5ns ± 0% ~ (p=1.000 n=1+1)
Reverse64-8 71.3ns ± 0% 6.8ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes-8 11.2ns ± 0% 3.5ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes16-8 6.24ns ± 0% 0.93ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes32-8 7.40ns ± 0% 1.55ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes64-8 10.5ns ± 0% 2.5ns ± 0% ~ (p=1.000 n=1+1)
Change-Id: I8aef1334b84f6cafd25edccad7e6868b37969efb
Reviewed-on: https://go-review.googlesource.com/37213
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2017-02-17 20:58:12 +00:00
Robert Griesemer
ddb15cea4a
math/bits: much faster ReverseBytes, added respective benchmarks
...
Measured on 2.3 GHz Intel Core i7, running maxOS 10.12.3.
benchmark old ns/op new ns/op delta
BenchmarkReverseBytes-8 11.4 3.51 -69.21%
BenchmarkReverseBytes16-8 6.87 0.64 -90.68%
BenchmarkReverseBytes32-8 7.79 0.65 -91.66%
BenchmarkReverseBytes64-8 11.6 0.64 -94.48%
name old time/op new time/op delta
ReverseBytes-8 11.4ns ± 0% 3.5ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes16-8 6.87ns ± 0% 0.64ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes32-8 7.79ns ± 0% 0.65ns ± 0% ~ (p=1.000 n=1+1)
ReverseBytes64-8 11.6ns ± 0% 0.6ns ± 0% ~ (p=1.000 n=1+1)
Change-Id: I67b529652b3b613c61687e9e185e8d4ee40c51a2
Reviewed-on: https://go-review.googlesource.com/37211
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2017-02-17 19:38:26 +00:00
Robert Griesemer
7d5c003a3a
math/bits: much faster Reverse, added respective benchmarks
...
Measured on 2.3 GHz Intel Core i7, running maxOS 10.12.3.
name old time/op new time/op delta
Reverse-8 76.6ns ± 0% 8.1ns ± 0% ~ (p=1.000 n=1+1)
Reverse8-8 12.6ns ± 0% 0.6ns ± 0% ~ (p=1.000 n=1+1)
Reverse16-8 20.8ns ± 0% 0.6ns ± 0% ~ (p=1.000 n=1+1)
Reverse32-8 36.5ns ± 0% 0.6ns ± 0% ~ (p=1.000 n=1+1)
Reverse64-8 74.0ns ± 0% 6.4ns ± 0% ~ (p=1.000 n=1+1)
benchmark old ns/op new ns/op delta
BenchmarkReverse-8 76.6 8.07 -89.46%
BenchmarkReverse8-8 12.6 0.64 -94.92%
BenchmarkReverse16-8 20.8 0.64 -96.92%
BenchmarkReverse32-8 36.5 0.64 -98.25%
BenchmarkReverse64-8 74.0 6.38 -91.38%
Change-Id: I6b99b10cee2f2babfe79342b50ee36a45a34da30
Reviewed-on: https://go-review.googlesource.com/37149
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
2017-02-17 19:38:13 +00:00
Robert Griesemer
661e2179e5
math/bits: added package for bit-level counting and manipulation
...
Initial platform-independent implementation.
For #18616 .
Change-Id: I4585c55b963101af9059c06c1b8a866cb384754c
Reviewed-on: https://go-review.googlesource.com/36315
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
2017-02-16 21:54:59 +00:00