[dev.link] cmd/link run generators in parallel
Small runtime win:
Stats for darwin, building cmd/compile:
Asmb 20.7ms ±14% 18.3ms ±14% -11.54% (p=0.002 n=10+10)
TotalTime 365ms ±10% 351ms ± 2% ~ (p=0.211 n=10+9)
Change-Id: Ia8afdf6948111d59b0c89e52cb50557a10f33c40
Reviewed-on: https://go-review.googlesource.com/c/go/+/257964
Trust: Jeremy Faller <jeremy@golang.org>
Run-TryBot: Jeremy Faller <jeremy@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go
index 6f4ccbf..778b0e9 100644
--- a/src/cmd/link/internal/ld/main.go
+++ b/src/cmd/link/internal/ld/main.go
@@ -36,12 +36,14 @@
"cmd/internal/objabi"
"cmd/internal/sys"
"cmd/link/internal/benchmark"
+ "cmd/link/internal/loader"
"flag"
"log"
"os"
"runtime"
"runtime/pprof"
"strings"
+ "sync"
)
var (
@@ -324,9 +326,15 @@
bench.Start("Asmb")
asmb(ctxt)
// Generate large symbols.
+ var wg sync.WaitGroup
for s, f := range ctxt.generatorSyms {
- f(ctxt, s)
+ wg.Add(1)
+ go func(f generatorFunc, s loader.Sym) {
+ defer wg.Done()
+ f(ctxt, s)
+ }(f, s)
}
+ wg.Wait()
bench.Start("Asmb2")
asmb2(ctxt)