]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: add benchmark that execs 'go env GOARCH'
authorDaniel Martí <mvdan@mvdan.cc>
Sun, 30 Dec 2018 17:43:13 +0000 (18:43 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Wed, 27 Feb 2019 16:18:23 +0000 (16:18 +0000)
'go env' is used for many quick operations, such as in go/packages to
query GOARCH and GOMOD. It often is a bottleneck; for example,
go/packages doesn't know whether or not to use Go modules until it has
queried GOMOD.

As such, this go command should be fast. Right now it's slower than it
should be. This commit adds a simple benchmark with os/exec, since we're
particularly interested in the cost of cmd/go's large init function.

Updates #29382.

Change-Id: Ifee6fb9997b9b89565fbfc2739a00c86117b1d37
Reviewed-on: https://go-review.googlesource.com/c/155961
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/init_test.go [new file with mode: 0644]

diff --git a/src/cmd/go/init_test.go b/src/cmd/go/init_test.go
new file mode 100644 (file)
index 0000000..ed90a77
--- /dev/null
@@ -0,0 +1,34 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main_test
+
+import (
+       "internal/testenv"
+       "os/exec"
+       "testing"
+)
+
+// BenchmarkExecGoEnv measures how long it takes for 'go env GOARCH' to run.
+// Since 'go' is executed, remember to run 'go install cmd/go' before running
+// the benchmark if any changes were done.
+func BenchmarkExecGoEnv(b *testing.B) {
+       testenv.MustHaveExec(b)
+       b.StopTimer()
+       gotool, err := testenv.GoTool()
+       if err != nil {
+               b.Fatal(err)
+       }
+       for i := 0; i < b.N; i++ {
+               cmd := exec.Command(gotool, "env", "GOARCH")
+
+               b.StartTimer()
+               err := cmd.Run()
+               b.StopTimer()
+
+               if err != nil {
+                       b.Fatal(err)
+               }
+       }
+}