driver: make metrics self-describing
The current metrics lack units and often don't really describe what
they're measuring. Change all of the metrics to follow the "value
units" guidelines in the standard benchmark format [1].
[1] https://github.com/golang/proposal/blob/master/design/14313-benchmark-format.md
Change-Id: I895f204d0f25702e0172070a533d0356d1149bea
Reviewed-on: https://go-review.googlesource.com/33582
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/driver/driver.go b/driver/driver.go
index d5060a7..bfe8d9b 100644
--- a/driver/driver.go
+++ b/driver/driver.go
@@ -131,7 +131,7 @@
fmt.Printf("Benchmark%s-%d %8d\t%10d ns/op", name, runtime.GOMAXPROCS(-1), res.N, res.RunTime)
var metrics []string
for metric := range res.Metrics {
- if metric == "time" {
+ if metric == "ns/op" {
// Already reported from res.RunTime.
continue
}
@@ -232,7 +232,7 @@
f(N)
res.Duration = time.Since(t0)
res.RunTime = uint64(time.Since(t0)) / N
- res.Metrics["time"] = res.RunTime
+ res.Metrics["ns/op"] = res.RunTime
pprof.StopCPUProfile()
latencyCollect(&res)
@@ -248,18 +248,18 @@
mstats1 := new(runtime.MemStats)
runtime.ReadMemStats(mstats1)
- res.Metrics["allocated"] = (mstats1.TotalAlloc - mstats0.TotalAlloc) / N
- res.Metrics["allocs"] = (mstats1.Mallocs - mstats0.Mallocs) / N
- res.Metrics["sys-total"] = mstats1.Sys
- res.Metrics["sys-heap"] = mstats1.HeapSys
- res.Metrics["sys-stack"] = mstats1.StackSys
- res.Metrics["gc-pause-total"] = (mstats1.PauseTotalNs - mstats0.PauseTotalNs) / N
+ res.Metrics["allocated-bytes/op"] = (mstats1.TotalAlloc - mstats0.TotalAlloc) / N
+ res.Metrics["allocs/op"] = (mstats1.Mallocs - mstats0.Mallocs) / N
+ res.Metrics["bytes-from-system"] = mstats1.Sys
+ res.Metrics["heap-bytes-from-system"] = mstats1.HeapSys
+ res.Metrics["stack-bytes-from-system"] = mstats1.StackSys
+ res.Metrics["STW-ns/op"] = (mstats1.PauseTotalNs - mstats0.PauseTotalNs) / N
collectGo12MemStats(&res, mstats0, mstats1)
numGC := uint64(mstats1.NumGC - mstats0.NumGC)
if numGC == 0 {
- res.Metrics["gc-pause-one"] = 0
+ res.Metrics["STW-ns/GC"] = 0
} else {
- res.Metrics["gc-pause-one"] = (mstats1.PauseTotalNs - mstats0.PauseTotalNs) / numGC
+ res.Metrics["STW-ns/GC"] = (mstats1.PauseTotalNs - mstats0.PauseTotalNs) / numGC
}
return res
}
@@ -321,9 +321,9 @@
cnt = len(latency.data)
}
sort.Sort(latency.data[:cnt])
- res.Metrics["latency-50"] = latency.data[cnt*50/100]
- res.Metrics["latency-95"] = latency.data[cnt*95/100]
- res.Metrics["latency-99"] = latency.data[cnt*99/100]
+ res.Metrics["P50-ns/op"] = latency.data[cnt*50/100]
+ res.Metrics["P95-ns/op"] = latency.data[cnt*95/100]
+ res.Metrics["P99-ns/op"] = latency.data[cnt*99/100]
}
// chooseN chooses the next number of iterations for benchmark.
diff --git a/driver/driver_go12.go b/driver/driver_go12.go
index 8dfed01..7a99810 100644
--- a/driver/driver_go12.go
+++ b/driver/driver_go12.go
@@ -12,6 +12,6 @@
// New mem stats added in Go1.2
func collectGo12MemStats(res *Result, mstats0, mstats1 *runtime.MemStats) {
- res.Metrics["sys-gc"] = mstats1.GCSys
- res.Metrics["sys-other"] = mstats1.OtherSys + mstats1.MSpanSys + mstats1.MCacheSys + mstats1.BuckHashSys
+ res.Metrics["GC-bytes-from-system"] = mstats1.GCSys
+ res.Metrics["other-bytes-from-system"] = mstats1.OtherSys + mstats1.MSpanSys + mstats1.MCacheSys + mstats1.BuckHashSys
}
diff --git a/driver/driver_unix.go b/driver/driver_unix.go
index f41f4f9..ec05eee 100644
--- a/driver/driver_unix.go
+++ b/driver/driver_unix.go
@@ -34,7 +34,7 @@
return
}
if vm := getVMPeak(); vm != 0 {
- res.Metrics["virtual-mem"] = vm
+ res.Metrics["peak-VM-bytes"] = vm
}
usage := new(syscall.Rusage)
if err := syscall.Getrusage(0, usage); err != nil {
@@ -42,8 +42,8 @@
// Deliberately ignore the error.
return
}
- res.Metrics["rss"] = uint64(usage.Maxrss) * rssMultiplier
- res.Metrics["cputime"] = (cpuTime(usage) - cpuTime(&ss.Rusage)) / ss.N
+ res.Metrics["peak-RSS-bytes"] = uint64(usage.Maxrss) * rssMultiplier
+ res.Metrics["user+sys-ns/op"] = (cpuTime(usage) - cpuTime(&ss.Rusage)) / ss.N
}
func RunAndCollectSysStats(cmd *exec.Cmd, res *Result, N uint64, prefix string) (string, error) {
@@ -57,9 +57,9 @@
t1 := time.Now()
usage := cmd.ProcessState.SysUsage().(*syscall.Rusage)
res.RunTime = uint64(t1.Sub(t0)) / N
- res.Metrics[prefix+"time"] = res.RunTime
- res.Metrics[prefix+"cputime"] = cpuTime(usage) / N
- res.Metrics[prefix+"rss"] = uint64(usage.Maxrss) * rssMultiplier
+ res.Metrics[prefix+"ns/op"] = res.RunTime
+ res.Metrics[prefix+"user+sys-ns/op"] = cpuTime(usage) / N
+ res.Metrics[prefix+"peak-RSS-bytes"] = uint64(usage.Maxrss) * rssMultiplier
return out.String(), nil
}
diff --git a/driver/driver_windows.go b/driver/driver_windows.go
index 777bee7..33ab74c 100644
--- a/driver/driver_windows.go
+++ b/driver/driver_windows.go
@@ -223,8 +223,8 @@
log.Printf("GetProcessTimes failed: %v", err)
return
}
- res.Metrics["cputime"] = (getCPUTime(CPU) - getCPUTime(ss.CPU)) / ss.N
- res.Metrics["rss"] = uint64(Mem.PeakWorkingSetSize)
+ res.Metrics["user+sys-ns/op"] = (getCPUTime(CPU) - getCPUTime(ss.CPU)) / ss.N
+ res.Metrics["peak-RSS-bytes"] = uint64(Mem.PeakWorkingSetSize)
}
func RunAndCollectSysStats(cmd *exec.Cmd, res *Result, N uint64, prefix string) (string, error) {
@@ -248,7 +248,7 @@
t1 := time.Now()
res.RunTime = uint64(t1.Sub(t0)) / N
- res.Metrics[prefix+"time"] = res.RunTime
+ res.Metrics[prefix+"ns/op"] = res.RunTime
childMu.Lock()
children = childProcesses
@@ -280,8 +280,8 @@
rss += uint64(Mem.PeakWorkingSetSize)
}
- res.Metrics[prefix+"cputime"] = cputime
- res.Metrics[prefix+"rss"] = rss
+ res.Metrics[prefix+"user+sys-ns/op"] = cputime
+ res.Metrics[prefix+"peak-RSS-bytes"] = rss
return out.String(), nil
}