Skip to content

Commit

Permalink
cmd/compile, etc: use tflag to optimize Name()==""
Browse files Browse the repository at this point in the history
Improves JSON decoding benchmark:

	name                  old time/op    new time/op    delta
	CodeDecoder-8           41.3ms ± 6%    39.8ms ± 1%  -3.61%  (p=0.000 n=10+10)

	name                  old speed      new speed      delta
	CodeDecoder-8         47.0MB/s ± 6%  48.7MB/s ± 1%  +3.66%  (p=0.000 n=10+10)

Change-Id: I524ee05c432fad5252e79b29222ec635c1dee4b4
Reviewed-on: https://go-review.googlesource.com/24452
Reviewed-by: Ian Lance Taylor <[email protected]>
Run-TryBot: Ian Lance Taylor <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
  • Loading branch information
crawshaw committed Jun 24, 2016
1 parent 2834526 commit 797dc58
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 47 deletions.
4 changes: 4 additions & 0 deletions src/cmd/compile/internal/gc/reflect.go
Original file line number Diff line number Diff line change
Expand Up @@ -799,6 +799,7 @@ func typeptrdata(t *Type) int64 {
const (
tflagUncommon = 1 << 0
tflagExtraStar = 1 << 1
tflagNamed = 1 << 2
)

var dcommontype_algarray *Sym
Expand Down Expand Up @@ -852,6 +853,9 @@ func dcommontype(s *Sym, ot int, t *Type) int {
if uncommonSize(t) != 0 {
tflag |= tflagUncommon
}
if t.Sym != nil && t.Sym.Name != "" {
tflag |= tflagNamed
}

exported := false
p := Tconv(t, FmtLeft|FmtUnsigned)
Expand Down
31 changes: 5 additions & 26 deletions src/reflect/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,9 @@ const (
// a program, the type *T also exists and reusing the str data
// saves binary size.
tflagExtraStar tflag = 1 << 1

// tflagNamed means the type has a name.
tflagNamed tflag = 1 << 2
)

// rtype is the common implementation of most values.
Expand Down Expand Up @@ -893,34 +896,10 @@ func hasPrefix(s, prefix string) bool {
}

func (t *rtype) Name() string {
s := t.String()
switch s[0] {
case 'm':
if hasPrefix(s, "map[") {
return ""
}
case 's':
if hasPrefix(s, "struct {") {
return ""
}
case 'c':
if hasPrefix(s, "chan ") {
return ""
}
if hasPrefix(s, "chan<-") {
return ""
}
case 'f':
if hasPrefix(s, "func(") {
return ""
}
case 'i':
if hasPrefix(s, "interface {") {
return ""
}
case '[', '*', '<':
if t.tflag&tflagNamed == 0 {
return ""
}
s := t.String()
i := len(s) - 1
for i >= 0 {
if s[i] == '.' {
Expand Down
24 changes: 3 additions & 21 deletions src/runtime/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type tflag uint8
const (
tflagUncommon tflag = 1 << 0
tflagExtraStar tflag = 1 << 1
tflagNamed tflag = 1 << 2
)

// Needs to be in sync with ../cmd/compile/internal/ld/decodesym.go:/^func.commonsize,
Expand Down Expand Up @@ -116,29 +117,10 @@ func hasPrefix(s, prefix string) bool {
}

func (t *_type) name() string {
s := t.string()
if hasPrefix(s, "map[") {
return ""
}
if hasPrefix(s, "struct {") {
return ""
}
if hasPrefix(s, "chan ") {
return ""
}
if hasPrefix(s, "chan<-") {
return ""
}
if hasPrefix(s, "func(") {
return ""
}
if hasPrefix(s, "interface {") {
return ""
}
switch s[0] {
case '[', '*', '<':
if t.tflag&tflagNamed == 0 {
return ""
}
s := t.string()
i := len(s) - 1
for i >= 0 {
if s[i] == '.' {
Expand Down

0 comments on commit 797dc58

Please sign in to comment.