mirror of
https://github.com/golang/go.git
synced 2025-05-23 08:21:24 +00:00
cmd/link: use BestSpeed for DWARF compression
DWARF compression accounts for roughly 30% of the linker's time. This CL switches from DefaultCompression to BestSpeed, which virtually eliminates this time. This roughly halves the overhead of handling DWARF in the linker: name \ time/op nodwarf dwarf dwarf-speed BuildCmdGoAll 10.0s ±11% 10.6s ± 5% 10.8s ± 5% nodwarf +6.41% +8.03% dwarf ~ LinkCmdGo 626ms ± 5% 1096ms ± 2% 860ms ± 2% nodwarf +75.17% +37.36% dwarf -21.59% Previously, enabling DWARF had a 75% overhead in link time for cmd/go. This change reduces this overhead to 37% (a 22% reduction). The effect on binary size is minimal compared to DefaultCompression, and still substantially better than no compression: cmd/go bytes nodwarf 10106953 dwarf 12159049 nodwarf+20% dwarf-speed 12408905 nodwarf+23% dwarf-nozlib 17766473 nodwarf+76% Updates #26318. Change-Id: I33bb7caa038a2753c29104501663daf4839e7054 Reviewed-on: https://go-review.googlesource.com/123356 Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Heschi Kreinick <heschi@google.com>
This commit is contained in:
parent
9300d223a3
commit
12ed0ddec1
@ -2177,7 +2177,14 @@ func compressSyms(ctxt *Link, syms []*sym.Symbol) []byte {
|
|||||||
binary.BigEndian.PutUint64(sizeBytes[:], uint64(total))
|
binary.BigEndian.PutUint64(sizeBytes[:], uint64(total))
|
||||||
buf.Write(sizeBytes[:])
|
buf.Write(sizeBytes[:])
|
||||||
|
|
||||||
z := zlib.NewWriter(&buf)
|
// Using zlib.BestSpeed achieves very nearly the same
|
||||||
|
// compression levels of zlib.DefaultCompression, but takes
|
||||||
|
// substantially less time. This is important because DWARF
|
||||||
|
// compression can be a significant fraction of link time.
|
||||||
|
z, err := zlib.NewWriterLevel(&buf, zlib.BestSpeed)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("NewWriterLevel failed: %s", err)
|
||||||
|
}
|
||||||
for _, sym := range syms {
|
for _, sym := range syms {
|
||||||
if _, err := z.Write(sym.P); err != nil {
|
if _, err := z.Write(sym.P); err != nil {
|
||||||
log.Fatalf("compression failed: %s", err)
|
log.Fatalf("compression failed: %s", err)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user