From a1925076fe5436bf7316fd2ab30d5e716df46f28 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Sun, 30 Dec 2018 18:43:13 +0100 Subject: [PATCH] cmd/go: add benchmark that execs 'go env GOARCH' MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit '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í TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/init_test.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/cmd/go/init_test.go diff --git a/src/cmd/go/init_test.go b/src/cmd/go/init_test.go new file mode 100644 index 0000000000..ed90a77841 --- /dev/null +++ b/src/cmd/go/init_test.go @@ -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) + } + } +} -- 2.48.1