mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: evaluate map initializers incrementally
For the code:
m := map[int]int {
a(): b(),
c(): d(),
e(): f(),
}
We used to do:
t1 := a()
t2 := b()
t3 := c()
t4 := d()
t5 := e()
t6 := f()
m := map[int]int{}
m[t1] = t2
m[t3] = t4
m[t5] = t6
After this CL we do:
m := map[int]int{}
t1 := a()
t2 := b()
m[t1] = t2
t3 := c()
t4 := d()
m[t3] = t4
t5 := e()
t6 := f()
m[t5] = t6
Ordering the initialization this way limits the lifetime of the
temporaries involved. In particular, for large maps the number of
simultaneously live temporaries goes from ~2*len(m) to ~2. This change
makes the compiler (regalloc, mostly) a lot happier. The compiler runs
faster and uses a lot less memory.
For #26546, changes compile time of a big map from 8 sec to 0.5 sec.
Fixes #26552
Update #26546
Change-Id: Ib7d202dead3feaf493a464779fd9611c63fcc25f
Reviewed-on: https://go-review.googlesource.com/c/go/+/174417
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
998cc2a1c5
commit
ee59c06acb
2 changed files with 57 additions and 0 deletions
|
|
@ -1080,6 +1080,11 @@ func anylit(n *Node, var_ *Node, init *Nodes) {
|
|||
default:
|
||||
Fatalf("anylit: not lit, op=%v node=%v", n.Op, n)
|
||||
|
||||
case ONAME:
|
||||
a := nod(OAS, var_, n)
|
||||
a = typecheck(a, ctxStmt)
|
||||
init.Append(a)
|
||||
|
||||
case OPTRLIT:
|
||||
if !t.IsPtr() {
|
||||
Fatalf("anylit: not ptr")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue