From 12ed0ddec198db0eaabbaaef28bb5ffb17204e11 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 11 Jul 2018 16:13:04 -0400 Subject: [PATCH] cmd/link: use BestSpeed for DWARF compression MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Heschi Kreinick --- src/cmd/link/internal/ld/data.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index c337c5e7ed..0ae93f1018 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -2177,7 +2177,14 @@ func compressSyms(ctxt *Link, syms []*sym.Symbol) []byte { binary.BigEndian.PutUint64(sizeBytes[:], uint64(total)) 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 { if _, err := z.Write(sym.P); err != nil { log.Fatalf("compression failed: %s", err) -- 2.48.1