diff options
| author | Robert Griesemer <gri@golang.org> | 2017-02-24 17:50:53 -0800 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2017-02-25 22:18:58 +0000 |
| commit | e18adbf88d35bc200d2b1c07ccb8f55f551942a0 (patch) | |
| tree | 8c1e1496c5444c1bed6f5832ebcb786bb5af7214 /src/math/bits/bits.go | |
| parent | bf584b15d6104661c272e2ab900c3d83d015b7d0 (diff) | |
| download | go-e18adbf88d35bc200d2b1c07ccb8f55f551942a0.tar.xz | |
math/bits: faster Reverse8/16 functions using table lookups
Measured on 2.3 GHz Intel Core i7, running macOS 10.12.3:
benchmark old ns/op new ns/op delta
BenchmarkReverse8-8 1.70 0.99 -41.76%
BenchmarkReverse16-8 2.24 1.32 -41.07%
Fixes #19279.
Change-Id: I398cf8a3513b7fa63c130efc7846a7c5353999d4
Reviewed-on: https://go-review.googlesource.com/37459
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/math/bits/bits.go')
| -rw-r--r-- | src/math/bits/bits.go | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/src/math/bits/bits.go b/src/math/bits/bits.go index 4038e9bf01..03bcb1c354 100644 --- a/src/math/bits/bits.go +++ b/src/math/bits/bits.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:generate go run make_tables.go + // Package bits implements bit counting and manipulation // functions for the predeclared unsigned integer types. package bits @@ -232,19 +234,12 @@ func Reverse(x uint) uint { // Reverse8 returns the value of x with its bits in reversed order. func Reverse8(x uint8) uint8 { - const m = 1<<8 - 1 - x = x>>1&(m0&m) | x&(m0&m)<<1 - x = x>>2&(m1&m) | x&(m1&m)<<2 - return x>>4 | x<<4 + return rev8tab[x] } // Reverse16 returns the value of x with its bits in reversed order. func Reverse16(x uint16) uint16 { - const m = 1<<16 - 1 - x = x>>1&(m0&m) | x&(m0&m)<<1 - x = x>>2&(m1&m) | x&(m1&m)<<2 - x = x>>4&(m2&m) | x&(m2&m)<<4 - return x>>8 | x<<8 + return uint16(rev8tab[x>>8]) | uint16(rev8tab[x&0xff])<<8 } // Reverse32 returns the value of x with its bits in reversed order. |
