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
 }