mirror of
https://github.com/golang/go
synced 2024-11-23 05:20:11 -07:00
cmd/internal/obj/x86: estimate text size
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>
This commit is contained in:
parent
fb950cd778
commit
8262564971
@ -53,6 +53,20 @@ func (s *LSym) Grow(lsiz int64) {
|
|||||||
s.P = s.P[:siz]
|
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.
|
// prepwrite prepares to write data of size siz into s at offset off.
|
||||||
func (s *LSym) prepwrite(ctxt *Link, off int64, siz int) {
|
func (s *LSym) prepwrite(ctxt *Link, off int64, siz int) {
|
||||||
if off < 0 || siz < 0 || off >= 1<<30 {
|
if off < 0 || siz < 0 || off >= 1<<30 {
|
||||||
|
@ -1796,7 +1796,9 @@ func span6(ctxt *obj.Link, s *obj.LSym) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var q *obj.Prog
|
var q *obj.Prog
|
||||||
|
var count int64 // rough count of number of instructions
|
||||||
for p := s.Text; p != nil; p = p.Link {
|
for p := s.Text; p != nil; p = p.Link {
|
||||||
|
count++
|
||||||
p.Back = 2 // use short branches first time through
|
p.Back = 2 // use short branches first time through
|
||||||
q = p.Pcond
|
q = p.Pcond
|
||||||
if q != nil && (q.Back&2 != 0) {
|
if q != nil && (q.Back&2 != 0) {
|
||||||
@ -1821,6 +1823,7 @@ func span6(ctxt *obj.Link, s *obj.LSym) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
s.GrowCap(count * 5) // preallocate roughly 5 bytes per instruction
|
||||||
|
|
||||||
n := 0
|
n := 0
|
||||||
var c int32
|
var c int32
|
||||||
|
Loading…
Reference in New Issue
Block a user