1
0
mirror of https://github.com/golang/go synced 2024-11-17 15:44:40 -07:00

encoding/json: consolidate the isSpace function

The new code is easier to read, and practically equivalent in terms of
performance.

	name                  old time/op    new time/op    delta
	CodeUnmarshal-2          166ms ± 1%     166ms ± 1%    ~     (p=0.863 n=11+10)
	CodeUnmarshalReuse-2     139ms ± 1%     139ms ± 1%    ~     (p=0.050 n=10+12)
	UnmarshalString-2       1.08µs ± 1%    1.07µs ± 1%  -0.64%  (p=0.001 n=10+11)
	UnmarshalFloat64-2      1.01µs ± 1%    1.01µs ± 1%    ~     (p=0.280 n=12+11)
	UnmarshalInt64-2         850ns ± 0%     851ns ± 0%    ~     (p=0.455 n=11+12)

	name                  old speed      new speed      delta
	CodeUnmarshal-2       11.7MB/s ± 1%  11.7MB/s ± 1%    ~     (p=0.904 n=11+10)
	CodeUnmarshalReuse-2  14.0MB/s ± 1%  14.0MB/s ± 1%  +0.40%  (p=0.041 n=10+12)

	name                  old alloc/op   new alloc/op   delta
	CodeUnmarshal-2         3.28MB ± 0%    3.28MB ± 0%    ~     (p=0.907 n=10+11)
	CodeUnmarshalReuse-2    2.19MB ± 0%    2.19MB ± 0%    ~     (p=0.306 n=12+12)
	UnmarshalString-2         192B ± 0%      192B ± 0%    ~     (all equal)
	UnmarshalFloat64-2        180B ± 0%      180B ± 0%    ~     (all equal)
	UnmarshalInt64-2          176B ± 0%      176B ± 0%    ~     (all equal)

	name                  old allocs/op  new allocs/op  delta
	CodeUnmarshal-2          92.7k ± 0%     92.7k ± 0%    ~     (all equal)
	CodeUnmarshalReuse-2     80.4k ± 0%     80.4k ± 0%    ~     (all equal)
	UnmarshalString-2         2.00 ± 0%      2.00 ± 0%    ~     (all equal)
	UnmarshalFloat64-2        2.00 ± 0%      2.00 ± 0%    ~     (all equal)
	UnmarshalInt64-2          1.00 ± 0%      1.00 ± 0%    ~     (all equal)

Change-Id: I6d5a48c624d436551409a17c21542e26d29e26b3
GitHub-Last-Rev: 7d81961688
GitHub-Pull-Request: golang/go#37385
Reviewed-on: https://go-review.googlesource.com/c/go/+/220581
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Joe Tsai <joetsai@google.com>
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
codesoap 2020-02-26 17:36:01 +00:00 committed by Joe Tsai
parent d0e9a4ebfd
commit a1103dcc27

View File

@ -195,12 +195,12 @@ func (s *scanner) popParseState() {
} }
func isSpace(c byte) bool { func isSpace(c byte) bool {
return c == ' ' || c == '\t' || c == '\r' || c == '\n' return c <= ' ' && (c == ' ' || c == '\t' || c == '\r' || c == '\n')
} }
// stateBeginValueOrEmpty is the state after reading `[`. // stateBeginValueOrEmpty is the state after reading `[`.
func stateBeginValueOrEmpty(s *scanner, c byte) int { func stateBeginValueOrEmpty(s *scanner, c byte) int {
if c <= ' ' && isSpace(c) { if isSpace(c) {
return scanSkipSpace return scanSkipSpace
} }
if c == ']' { if c == ']' {
@ -211,7 +211,7 @@ func stateBeginValueOrEmpty(s *scanner, c byte) int {
// stateBeginValue is the state at the beginning of the input. // stateBeginValue is the state at the beginning of the input.
func stateBeginValue(s *scanner, c byte) int { func stateBeginValue(s *scanner, c byte) int {
if c <= ' ' && isSpace(c) { if isSpace(c) {
return scanSkipSpace return scanSkipSpace
} }
switch c { switch c {
@ -249,7 +249,7 @@ func stateBeginValue(s *scanner, c byte) int {
// stateBeginStringOrEmpty is the state after reading `{`. // stateBeginStringOrEmpty is the state after reading `{`.
func stateBeginStringOrEmpty(s *scanner, c byte) int { func stateBeginStringOrEmpty(s *scanner, c byte) int {
if c <= ' ' && isSpace(c) { if isSpace(c) {
return scanSkipSpace return scanSkipSpace
} }
if c == '}' { if c == '}' {
@ -262,7 +262,7 @@ func stateBeginStringOrEmpty(s *scanner, c byte) int {
// stateBeginString is the state after reading `{"key": value,`. // stateBeginString is the state after reading `{"key": value,`.
func stateBeginString(s *scanner, c byte) int { func stateBeginString(s *scanner, c byte) int {
if c <= ' ' && isSpace(c) { if isSpace(c) {
return scanSkipSpace return scanSkipSpace
} }
if c == '"' { if c == '"' {
@ -282,7 +282,7 @@ func stateEndValue(s *scanner, c byte) int {
s.endTop = true s.endTop = true
return stateEndTop(s, c) return stateEndTop(s, c)
} }
if c <= ' ' && isSpace(c) { if isSpace(c) {
s.step = stateEndValue s.step = stateEndValue
return scanSkipSpace return scanSkipSpace
} }