From 42a82ce1a7051b3a2762bff73b6eda4797e0fd4b Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 24 Jan 2019 17:27:23 +0000 Subject: [PATCH] math/bits: optimize Reverse32 and Reverse64 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Use ReverseBytes32 and ReverseBytes64 to speed up these functions. The byte reversal functions are intrinsics on most platforms and generally compile to a single instruction. name old time/op new time/op delta Reverse32 2.41ns ± 1% 1.94ns ± 3% -19.60% (p=0.000 n=20+19) Reverse64 3.85ns ± 1% 2.56ns ± 1% -33.32% (p=0.000 n=17+19) Change-Id: I160bf59a0c7bd5db94114803ec5a59fae448f096 Reviewed-on: https://go-review.googlesource.com/c/159358 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/bits/bits.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/math/bits/bits.go b/src/math/bits/bits.go index b06c363348..6f367dcc93 100644 --- a/src/math/bits/bits.go +++ b/src/math/bits/bits.go @@ -232,8 +232,7 @@ func Reverse32(x uint32) uint32 { 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 - x = x>>8&(m3&m) | x&(m3&m)<<8 - return x>>16 | x<<16 + return ReverseBytes32(x) } // Reverse64 returns the value of x with its bits in reversed order. @@ -242,9 +241,7 @@ func Reverse64(x uint64) uint64 { 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 - x = x>>8&(m3&m) | x&(m3&m)<<8 - x = x>>16&(m4&m) | x&(m4&m)<<16 - return x>>32 | x<<32 + return ReverseBytes64(x) } // --- ReverseBytes --- -- 2.50.0