]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: add size hint to map literal allocations
authorKeith Randall <khr@golang.org>
Sun, 29 May 2016 18:16:13 +0000 (11:16 -0700)
committerKeith Randall <khr@golang.org>
Tue, 16 Aug 2016 17:19:48 +0000 (17:19 +0000)
Might as well tell the runtime how large the map is going to be.
This avoids grow work and allocations while the map is being built.

Will wait for 1.8.

Fixes #15880
Fixes #16279

Change-Id: I377e3e5ec1e2e76ea2a50cc00810adda20ad0e79
Reviewed-on: https://go-review.googlesource.com/23558
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/gc/sinit.go
src/cmd/compile/internal/gc/syntax.go

index 4469d71f1c56ccc4beb606348e984eb6cd6a19b0..72c06dde2d559c0d8a6d705549242ddf6e1a627f 100644 (file)
@@ -866,7 +866,7 @@ func maplit(ctxt int, n *Node, var_ *Node, init *Nodes) {
        nerr := nerrors
 
        a := Nod(OMAKE, nil, nil)
-       a.List.Set1(typenod(n.Type))
+       a.List.Set2(typenod(n.Type), Nodintconst(int64(len(n.List.Slice()))))
        litas(var_, a, init)
 
        // count the initializers
index df9f838e7729115a1c4846addc9bf6231e1ca36e..58f95e82c98e23fb0983b7ca1e4baaea367705a9 100644 (file)
@@ -545,6 +545,11 @@ func (n *Nodes) Set1(node *Node) {
        n.slice = &[]*Node{node}
 }
 
+// Set2 sets n to a slice containing two nodes.
+func (n *Nodes) Set2(n1, n2 *Node) {
+       n.slice = &[]*Node{n1, n2}
+}
+
 // MoveNodes sets n to the contents of n2, then clears n2.
 func (n *Nodes) MoveNodes(n2 *Nodes) {
        n.slice = n2.slice