Commit 629b5e75 authored by Martin Möhrmann's avatar Martin Möhrmann

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 <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarRob Pike <r@golang.org>
parent 6661cf6d
...@@ -1201,6 +1201,14 @@ func BenchmarkSprintfTruncateString(b *testing.B) { ...@@ -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) { func BenchmarkSprintfQuoteString(b *testing.B) {
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
for pb.Next() { for pb.Next() {
......
...@@ -1067,8 +1067,11 @@ formatLoop: ...@@ -1067,8 +1067,11 @@ formatLoop:
break break
} }
verb, w := utf8.DecodeRuneInString(format[i:]) verb, size := rune(format[i]), 1
i += w if verb >= utf8.RuneSelf {
verb, size = utf8.DecodeRuneInString(format[i:])
}
i += size
switch { switch {
case verb == '%': // Percent does not absorb operands and ignores f.wid and f.prec. case verb == '%': // Percent does not absorb operands and ignores f.wid and f.prec.
......
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