From: Martin Möhrmann Date: Fri, 10 Mar 2017 19:55:51 +0000 (+0100) Subject: fmt: add ascii fast path for decoding verbs X-Git-Tag: go1.10beta1~1605 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=629b5e7561ab10cb11b47e3818dd861f8a030a26;p=gostls13.git fmt: add ascii fast path for decoding verbs name old time/op new time/op delta SprintfSlowParsingPath 108ns ± 4% 103ns ± 4% -4.53% (p=0.000 n=18+18) Change-Id: I174463f303d1857e8d5b8a6283c025b3546e7b39 Reviewed-on: https://go-review.googlesource.com/44450 Run-TryBot: Martin Möhrmann TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 9bec6f3f9e..e6239a51ba 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -1201,6 +1201,14 @@ func BenchmarkSprintfTruncateString(b *testing.B) { }) } +func BenchmarkSprintfSlowParsingPath(b *testing.B) { + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + Sprintf("%.v", nil) + } + }) +} + func BenchmarkSprintfQuoteString(b *testing.B) { b.RunParallel(func(pb *testing.PB) { for pb.Next() { diff --git a/src/fmt/print.go b/src/fmt/print.go index 2bd88f95a2..d1c99c1cd3 100644 --- a/src/fmt/print.go +++ b/src/fmt/print.go @@ -1067,8 +1067,11 @@ formatLoop: break } - verb, w := utf8.DecodeRuneInString(format[i:]) - i += w + verb, size := rune(format[i]), 1 + if verb >= utf8.RuneSelf { + verb, size = utf8.DecodeRuneInString(format[i:]) + } + i += size switch { case verb == '%': // Percent does not absorb operands and ignores f.wid and f.prec.