]> Cypherpunks repositories - gostls13.git/commitdiff
strconv: make FormatFloat slowpath a little faster
authorAlberto Donizetti <alb.donizetti@gmail.com>
Sat, 1 Oct 2016 12:01:09 +0000 (14:01 +0200)
committerRobert Griesemer <gri@golang.org>
Mon, 17 Oct 2016 18:23:32 +0000 (18:23 +0000)
The relevant benchmark (on an Intel i7-4510U machine):

name                      old time/op  new time/op  delta
FormatFloat/Slowpath64-4  68.6µs ± 0%  44.1µs ± 2%  -35.71%  (p=0.000 n=13+15)

Change-Id: I67eb0e81ce74ed57752d0280059f91419f09e93b
Reviewed-on: https://go-review.googlesource.com/30099
Reviewed-by: Robert Griesemer <gri@golang.org>
src/strconv/decimal.go
src/strconv/ftoa_test.go

index 5252d6e86eb66bc866e4d28c276e457cb1de181c..957acd989180de2811602ece16bc6a0175b6370e 100644 (file)
@@ -131,11 +131,13 @@ func rightShift(a *decimal, k uint) {
        }
        a.dp -= r - 1
 
+       var mask uint = (1 << k) - 1
+
        // Pick up a digit, put down a digit.
        for ; r < a.nd; r++ {
                c := uint(a.d[r])
                dig := n >> k
-               n -= dig << k
+               n &= mask
                a.d[w] = byte(dig + '0')
                w++
                n = n*10 + c - '0'
@@ -144,7 +146,7 @@ func rightShift(a *decimal, k uint) {
        // Put down extra digits.
        for n > 0 {
                dig := n >> k
-               n -= dig << k
+               n &= mask
                if w < len(a.d) {
                        a.d[w] = byte(dig + '0')
                        w++
index 1d25242ff3fee2fe7aeaf5006e7e76b6a52286ec..976bd2c9b8b9827e862aa3ba161c3e17a04ab6b4 100644 (file)
@@ -208,6 +208,9 @@ var ftoaBenches = []struct {
        {"64Fixed2", 123.456, 'e', 3, 64},
        {"64Fixed3", 1.23456e+78, 'e', 3, 64},
        {"64Fixed4", 1.23456e-78, 'e', 3, 64},
+
+       // Trigger slow path (see issue #15672).
+       {"Slowpath64", 622666234635.3213e-320, 'e', -1, 64},
 }
 
 func BenchmarkFormatFloat(b *testing.B) {