blob: 8dea9f4a810961c4b57a867f8d12980fe17c3caa [file] [log] [blame]
// Copyright 2013 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 build
import (
"bytes"
"log"
"os"
"os/exec"
"path/filepath"
"runtime"
"time"
"code.google.com/p/go.benchmarks/driver"
)
func init() {
driver.Register("build", benchmark)
}
func benchmark() driver.Result {
if os.Getenv("GOMAXPROCS") == "" {
os.Setenv("GOMAXPROCS", "1")
}
res := driver.MakeResult()
for i := 0; i < driver.BenchNum; i++ {
res1 := benchmarkOnce()
if res.RunTime == 0 || res.RunTime > res1.RunTime {
res = res1
}
log.Printf("Run %v: %+v\n", i, res)
}
perf1, perf2 := driver.RunUnderProfiler("go", "install", "-a", "-p", os.Getenv("GOMAXPROCS"), "cmd/go")
if perf1 != "" {
res.Files["processes"] = perf1
}
if perf2 != "" {
res.Files["cpuprof"] = perf2
}
return res
}
func benchmarkOnce() driver.Result {
// run 'go build -a'
t0 := time.Now()
cmd := exec.Command("go", "install", "-a", "-p", os.Getenv("GOMAXPROCS"), "cmd/go")
var stderr bytes.Buffer
cmd.Stderr = &stderr
if err := cmd.Start(); err != nil {
log.Fatalf("Failed to start 'go install -a cmd/go': %v", err)
}
ss := driver.InitSysStats(1, cmd)
if err := cmd.Wait(); err != nil {
log.Fatalf("Failed to run 'go install -a cmd/go': %v\n%v", err, stderr.String())
}
res := driver.MakeResult()
res.RunTime = uint64(time.Since(t0))
res.Metrics["build-time"] = res.RunTime
ss.Collect(&res, "build-")
// go command binary size
gobin := filepath.Join(os.Getenv("GOROOT"), "bin", "go")
if runtime.GOOS == "windows" {
gobin += ".exe"
}
gof, err := os.Open(gobin)
if err != nil {
log.Fatalf("Failed to open $GOROOT/bin/go: %v\n", err)
}
st, err := gof.Stat()
if err != nil {
log.Fatalf("Failed to stat $GOROOT/bin/go: %v\n", err)
}
res.Metrics["binary-size"] = uint64(st.Size())
sizef := driver.Size(gobin)
if sizef != "" {
res.Files["sections"] = sizef
}
return res
}