From 32cb0ce65b39fc91923ac12a0a94f34b5dfd04be Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Sat, 18 Mar 2017 18:43:20 +0100 Subject: encoding/gob: speedup floats encoding and decoding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By replacing bytes-reversing routines with bits.ReverseBytes64 calls. name old time/op new time/op delta EncodeComplex128Slice-4 35.1µs ± 1% 23.2µs ± 2% -33.94% (p=0.000 n=20+20) EncodeFloat64Slice-4 17.9µs ± 1% 11.0µs ± 1% -38.36% (p=0.000 n=17+18) name old time/op new time/op delta DecodeComplex128Slice-4 79.7µs ± 0% 69.9µs ± 1% -12.31% (p=0.000 n=20+20) DecodeFloat64Slice-4 47.3µs ± 1% 42.2µs ± 1% -10.65% (p=0.000 n=17+17) Change-Id: I91a6401c6009b5712fca6258dd1e57c6fe68ea64 Reviewed-on: https://go-review.googlesource.com/38352 Run-TryBot: Alberto Donizetti TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/gob/decode.go | 8 ++------ src/encoding/gob/encode.go | 8 +------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/encoding/gob/decode.go b/src/encoding/gob/decode.go index 792c159ded..92d9d3ef87 100644 --- a/src/encoding/gob/decode.go +++ b/src/encoding/gob/decode.go @@ -11,6 +11,7 @@ import ( "errors" "io" "math" + "math/bits" "reflect" ) @@ -313,12 +314,7 @@ func decUint64(i *decInstr, state *decoderState, value reflect.Value) { // (for example) transmit more compactly. This routine does the // unswizzling. func float64FromBits(u uint64) float64 { - var v uint64 - for i := 0; i < 8; i++ { - v <<= 8 - v |= u & 0xFF - u >>= 8 - } + v := bits.ReverseBytes64(u) return math.Float64frombits(v) } diff --git a/src/encoding/gob/encode.go b/src/encoding/gob/encode.go index d67153da90..edf204f47d 100644 --- a/src/encoding/gob/encode.go +++ b/src/encoding/gob/encode.go @@ -209,13 +209,7 @@ func encUint(i *encInstr, state *encoderState, v reflect.Value) { // swizzling. func floatBits(f float64) uint64 { u := math.Float64bits(f) - var v uint64 - for i := 0; i < 8; i++ { - v <<= 8 - v |= u & 0xFF - u >>= 8 - } - return v + return bits.ReverseBytes64(u) } // encFloat encodes the floating point value (float32 float64) referenced by v. -- cgit v1.2.3-54-g00ecf