From 7745887299ffd504a804ea7998424a02d3941ad3 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 19 Apr 2017 07:33:51 -0700 Subject: [PATCH] cmd/compilebench: add object file size to package benchmarks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Protected by flag -obj. Sample relevant output from compilecmp using this commit. name old obj-bytes new obj-bytes delta Template 382k ± 0% 381k ± 0% -0.23% (p=0.002 n=6+6) Unicode 203k ± 0% 203k ± 0% -0.00% (p=0.002 n=6+6) GoTypes 1.18M ± 0% 1.17M ± 0% -0.08% (p=0.002 n=6+6) Compiler 3.99M ± 0% 3.99M ± 0% -0.08% (p=0.002 n=6+6) SSA 8.28M ± 0% 8.28M ± 0% -0.02% (p=0.002 n=6+6) Flate 230k ± 0% 230k ± 0% -0.05% (p=0.002 n=6+6) GoParser 287k ± 0% 287k ± 0% -0.16% (p=0.002 n=6+6) Reflect 1.00M ± 0% 1.00M ± 0% -0.01% (p=0.002 n=6+6) Tar 190k ± 0% 189k ± 0% -0.24% (p=0.002 n=6+6) XML 416k ± 0% 415k ± 0% -0.16% (p=0.002 n=6+6) name old export-bytes new export-bytes delta Template 19.0k ± 0% 18.2k ± 0% -4.55% (p=0.002 n=6+6) Unicode 4.45k ± 0% 4.44k ± 0% -0.11% (p=0.002 n=6+6) GoTypes 29.7k ± 0% 28.8k ± 0% -3.12% (p=0.002 n=6+6) Compiler 75.6k ± 0% 72.5k ± 0% -4.03% (p=0.002 n=6+6) SSA 76.2k ± 0% 74.8k ± 0% -1.72% (p=0.002 n=6+6) Flate 4.98k ± 0% 4.87k ± 0% -2.29% (p=0.002 n=6+6) GoParser 8.81k ± 0% 8.34k ± 0% -5.30% (p=0.002 n=6+6) Reflect 6.25k ± 0% 6.16k ± 0% -1.49% (p=0.002 n=6+6) Tar 9.49k ± 0% 9.03k ± 0% -4.82% (p=0.002 n=6+6) XML 16.0k ± 0% 15.4k ± 0% -4.03% (p=0.002 n=6+6) Change-Id: I3f5e6ec022cb02ad6937f7859c573ca1edc39fb7 Reviewed-on: https://go-review.googlesource.com/41053 Reviewed-by: Robert Griesemer --- cmd/compilebench/main.go | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/cmd/compilebench/main.go b/cmd/compilebench/main.go index 8bb538781b..6869db5d23 100644 --- a/cmd/compilebench/main.go +++ b/cmd/compilebench/main.go @@ -34,6 +34,9 @@ // -memprofilerate rate // Set runtime.MemProfileRate during compilation. // +// -obj +// Report object file statistics. +// // -run regexp // Only run benchmarks with names matching regexp. // @@ -60,6 +63,7 @@ package main import ( + "bytes" "flag" "fmt" "go/build" @@ -84,6 +88,7 @@ var ( var ( flagAlloc = flag.Bool("alloc", false, "report allocations") + flagObj = flag.Bool("obj", false, "report object file stats") flagCompiler = flag.String("compile", "", "use `exe` as the cmd/compile binary") flagCompilerFlags = flag.String("compileflags", "", "additional `flags` to pass to compile") flagRun = flag.String("run", "", "run benchmarks matching `regexp`") @@ -268,7 +273,7 @@ func runBuild(name, dir string, count int) { } end := time.Now() - var allocs, bytes int64 + var allocs, allocbytes int64 if *flagAlloc || *flagMemprofile != "" { out, err := ioutil.ReadFile(pkg.Dir + "/_compilebench_.memprof") if err != nil { @@ -285,7 +290,7 @@ func runBuild(name, dir string, count int) { } switch f[1] { case "TotalAlloc": - bytes = val + allocbytes = val case "Mallocs": allocs = val } @@ -317,11 +322,25 @@ func runBuild(name, dir string, count int) { wallns := end.Sub(start).Nanoseconds() userns := cmd.ProcessState.UserTime().Nanoseconds() + fmt.Printf("%s 1 %d ns/op %d user-ns/op", name, wallns, userns) if *flagAlloc { - fmt.Printf("%s 1 %d ns/op %d user-ns/op %d B/op %d allocs/op\n", name, wallns, userns, bytes, allocs) - } else { - fmt.Printf("%s 1 %d ns/op %d user-ns/op\n", name, wallns, userns) + fmt.Printf(" %d B/op %d allocs/op", allocbytes, allocs) } - os.Remove(pkg.Dir + "/_compilebench_.o") + opath := pkg.Dir + "/_compilebench_.o" + if *flagObj { + // TODO(josharian): object files are big; just read enough to find what we seek. + data, err := ioutil.ReadFile(opath) + if err != nil { + log.Print(err) + } + // Find start of export data. + i := bytes.Index(data, []byte("\n$$B\n")) + len("\n$$B\n") + // Count bytes to end of export data. + nexport := bytes.Index(data[i:], []byte("\n$$\n")) + fmt.Printf(" %d object-bytes %d export-bytes", len(data), nexport) + } + fmt.Println() + + os.Remove(opath) }