Commit 32cb0ce6 authored by Alberto Donizetti's avatar Alberto Donizetti Committed by Brad Fitzpatrick

encoding/gob: speedup floats encoding and decoding

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 <alb.donizetti@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent b6074a41
...@@ -11,6 +11,7 @@ import ( ...@@ -11,6 +11,7 @@ import (
"errors" "errors"
"io" "io"
"math" "math"
"math/bits"
"reflect" "reflect"
) )
...@@ -313,12 +314,7 @@ func decUint64(i *decInstr, state *decoderState, value reflect.Value) { ...@@ -313,12 +314,7 @@ func decUint64(i *decInstr, state *decoderState, value reflect.Value) {
// (for example) transmit more compactly. This routine does the // (for example) transmit more compactly. This routine does the
// unswizzling. // unswizzling.
func float64FromBits(u uint64) float64 { func float64FromBits(u uint64) float64 {
var v uint64 v := bits.ReverseBytes64(u)
for i := 0; i < 8; i++ {
v <<= 8
v |= u & 0xFF
u >>= 8
}
return math.Float64frombits(v) return math.Float64frombits(v)
} }
......
...@@ -209,13 +209,7 @@ func encUint(i *encInstr, state *encoderState, v reflect.Value) { ...@@ -209,13 +209,7 @@ func encUint(i *encInstr, state *encoderState, v reflect.Value) {
// swizzling. // swizzling.
func floatBits(f float64) uint64 { func floatBits(f float64) uint64 {
u := math.Float64bits(f) u := math.Float64bits(f)
var v uint64 return bits.ReverseBytes64(u)
for i := 0; i < 8; i++ {
v <<= 8
v |= u & 0xFF
u >>= 8
}
return v
} }
// encFloat encodes the floating point value (float32 float64) referenced by v. // encFloat encodes the floating point value (float32 float64) referenced by v.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment