We can’t perfectly predict how large the function
will be, but we can make a safe overestimate.
No significant CPU time changes.
name old alloc/op new alloc/op delta
Template 67.7MB ± 0% 67.5MB ± 0% -0.24% (p=0.029 n=4+4)
Unicode 43.9MB ± 0% 43.8MB ± 0% -0.13% (p=0.029 n=4+4)
GoTypes 244MB ± 0% 244MB ± 0% -0.28% (p=0.029 n=4+4)
Compiler 1.05GB ± 0% 1.05GB ± 0% -0.38% (p=0.029 n=4+4)
name old allocs/op new allocs/op delta
Template 795k ± 0% 794k ± 0% -0.14% (p=0.029 n=4+4)
Unicode 569k ± 0% 569k ± 0% ~ (p=0.114 n=4+4)
GoTypes 2.59M ± 0% 2.58M ± 0% -0.11% (p=0.029 n=4+4)
Compiler 11.0M ± 0% 11.0M ± 0% -0.09% (p=0.029 n=4+4)
Passes toolstash -cmp.
Change-Id: I0a92ab04cba7520540ec58fe7189666d0e771454
Reviewed-on: https://go-review.googlesource.com/20771
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
s.P = s.P[:siz]
}
+// GrowCap increases the capacity of s.P to c.
+func (s *LSym) GrowCap(c int64) {
+ if int64(cap(s.P)) >= c {
+ return
+ }
+ if s.P == nil {
+ s.P = make([]byte, 0, c)
+ return
+ }
+ b := make([]byte, len(s.P), c)
+ copy(b, s.P)
+ s.P = b
+}
+
// prepwrite prepares to write data of size siz into s at offset off.
func (s *LSym) prepwrite(ctxt *Link, off int64, siz int) {
if off < 0 || siz < 0 || off >= 1<<30 {
}
var q *obj.Prog
+ var count int64 // rough count of number of instructions
for p := s.Text; p != nil; p = p.Link {
+ count++
p.Back = 2 // use short branches first time through
q = p.Pcond
if q != nil && (q.Back&2 != 0) {
}
}
}
+ s.GrowCap(count * 5) // preallocate roughly 5 bytes per instruction
n := 0
var c int32