1
0
mirror of https://github.com/golang/go synced 2024-11-19 01:04:40 -07:00

cmd/compile: move Type.Maplineno to separate data structure

Relatively few types are ever used as map keys,
so tracking this separately is a net win.

Passes toolstash -cmp.

name       old alloc/op     new alloc/op     delta
Template       55.9MB ± 0%      55.5MB ± 0%  -0.71%        (p=0.000 n=10+10)
Unicode        37.8MB ± 0%      37.7MB ± 0%  -0.27%        (p=0.000 n=10+10)
GoTypes         180MB ± 0%       179MB ± 0%  -0.52%         (p=0.000 n=7+10)
Compiler        806MB ± 0%       803MB ± 0%  -0.41%        (p=0.000 n=10+10)

CPU and number of allocs are unchanged.

Change-Id: I6d60d74a4866995a231dfed3dd5792d75d904292
Reviewed-on: https://go-review.googlesource.com/21622
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Josh Bleecher Snyder 2016-04-06 14:12:48 -07:00
parent d636d7907c
commit 007b12977a
4 changed files with 12 additions and 10 deletions

View File

@ -27,7 +27,7 @@ func TestSizeof(t *testing.T) {
{Name{}, 52, 80},
{Node{}, 92, 144},
{Sym{}, 60, 112},
{Type{}, 56, 88},
{Type{}, 52, 80},
{MapType{}, 20, 40},
{ForwardType{}, 16, 32},
{FuncType{}, 28, 48},

View File

@ -390,8 +390,8 @@ func checkMapKeyType(key *Type) {
// before key is fully defined, the error
// will only be printed for the first one.
// good enough.
if key.Maplineno == 0 {
key.Maplineno = lineno
if maplineno[key] == 0 {
maplineno[key] = lineno
}
}
}

View File

@ -153,8 +153,6 @@ type Type struct {
Vargen int32 // unique name for OTYPE/ONAME
Lineno int32 // line at which this type was declared, implicitly or explicitly
Maplineno int32 // first use of this type as a map key
Etype EType // kind of type
Noalg bool // suppress hash and eq algorithm generation
Trecur uint8 // to detect loops

View File

@ -3513,7 +3513,11 @@ func domethod(n *Node) {
checkwidth(n.Type)
}
var mapqueue []*Node
var (
mapqueue []*Node
// maplineno tracks the line numbers at which types are first used as map keys
maplineno = map[*Type]int32{}
)
func copytype(n *Node, t *Type) {
if t.Etype == TFORW {
@ -3522,7 +3526,7 @@ func copytype(n *Node, t *Type) {
return
}
maplineno := n.Type.Maplineno
mapline := maplineno[n.Type]
embedlineno := n.Type.ForwardType().Embedlineno
l := n.Type.ForwardType().Copyto
@ -3559,8 +3563,8 @@ func copytype(n *Node, t *Type) {
lineno = lno
// Queue check for map until all the types are done settling.
if maplineno != 0 {
t.Maplineno = maplineno
if mapline != 0 {
maplineno[t] = mapline
mapqueue = append(mapqueue, n)
}
}
@ -3609,7 +3613,7 @@ ret:
}
for _, n := range mapqueue {
lineno = n.Type.Maplineno
lineno = maplineno[n.Type]
checkMapKeyType(n.Type)
}