summaryrefslogtreecommitdiff
path: root/src/fmt
diff options
context:
space:
mode:
authorMartin Möhrmann <moehrmann@google.com>2017-03-10 20:55:51 +0100
committerMartin Möhrmann <moehrmann@google.com>2017-08-14 12:25:45 +0000
commit629b5e7561ab10cb11b47e3818dd861f8a030a26 (patch)
treeca25d0b7ad233ea3d50e449d6e942e727c65354d /src/fmt
parent6661cf6dfd91dc3dd5d233e8bdb9f2d60829c68e (diff)
downloadgo-git-629b5e7561ab10cb11b47e3818dd861f8a030a26.tar.gz
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: Rob Pike <r@golang.org>
Diffstat (limited to 'src/fmt')
-rw-r--r--src/fmt/fmt_test.go8
-rw-r--r--src/fmt/print.go7
2 files changed, 13 insertions, 2 deletions
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.