summaryrefslogtreecommitdiff
path: root/test/bench
diff options
context:
space:
mode:
authordvyukov <dvyukov@google.com>2013-11-19 12:55:12 +0400
committerdvyukov <dvyukov@google.com>2013-11-19 12:55:12 +0400
commitb7946e74261232e5cf9280f87326217462f0ec2b (patch)
tree4a5cf33d1087219add8173c1a80c9e7ba1953659 /test/bench
parent75756135c4dc55309f4cebd6be7add0d0e517b9e (diff)
downloadgo-b7946e74261232e5cf9280f87326217462f0ec2b.tar.gz
13+
Diffstat (limited to 'test/bench')
-rw-r--r--test/bench/perf/bench1.go11
-rw-r--r--test/bench/perf/bench2.go5
-rw-r--r--test/bench/perf/driver.go103
3 files changed, 119 insertions, 0 deletions
diff --git a/test/bench/perf/bench1.go b/test/bench/perf/bench1.go
new file mode 100644
index 000000000..2f776641e
--- /dev/null
+++ b/test/bench/perf/bench1.go
@@ -0,0 +1,11 @@
+package main
+
+import (
+ "time"
+)
+
+func Benchmark(N int64) error {
+ // 13+
+ time.Sleep(time.Duration(N) * time.Millisecond)
+ return nil
+}
diff --git a/test/bench/perf/bench2.go b/test/bench/perf/bench2.go
new file mode 100644
index 000000000..8086197a0
--- /dev/null
+++ b/test/bench/perf/bench2.go
@@ -0,0 +1,5 @@
+package main
+
+func Benchmark(N int64) error {
+ return nil
+}
diff --git a/test/bench/perf/driver.go b/test/bench/perf/driver.go
new file mode 100644
index 000000000..00cd66199
--- /dev/null
+++ b/test/bench/perf/driver.go
@@ -0,0 +1,103 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "os"
+ "time"
+)
+
+var (
+ benchNum = flag.Int("benchnum", 3, "run each benchmark that many times")
+ benchTime = flag.Duration("benchtime", 10*time.Second, "benchmarking time for a single run")
+ benchMem = flag.Int("benchmem", 64, "approx RSS value to aim at in benchmarks, in MB")
+)
+
+type Result struct {
+ N int64
+ RunTime time.Duration
+}
+
+func main() {
+ flag.Parse()
+ var res Result
+ for i := 0; i < *benchNum; i++ {
+ res1 := RunBenchmark()
+ if res.RunTime == 0 || res.RunTime > res1.RunTime {
+ res = res1
+ }
+ }
+ fmt.Printf("GOPERF-METRIC:runtime=%v\n", int64(res.RunTime)/res.N)
+}
+
+func RunBenchmark() Result {
+ var res Result
+ for ChooseN(&res) {
+ res = RunOnce(res.N)
+ }
+ return res
+}
+
+func RunOnce(N int64) Result {
+ fmt.Printf("Benchmarking %v iterations\n", N)
+ t0 := time.Now()
+ err := Benchmark(N)
+ if err != nil {
+ fmt.Printf("Benchmark function failed: %v\n", err)
+ os.Exit(1)
+ }
+ res := Result{N: N}
+ res.RunTime = time.Since(t0)
+ return res
+}
+
+func ChooseN(res *Result) bool {
+ const MaxN = 1e12
+ last := res.N
+ if last == 0 {
+ res.N = 1
+ return true
+ } else if res.RunTime >= *benchTime || last >= MaxN {
+ return false
+ }
+ nsPerOp := max(1, int64(res.RunTime)/last)
+ res.N = int64(*benchTime) / nsPerOp
+ res.N = max(min(res.N+res.N/2, 100*last), last+1)
+ res.N = roundUp(res.N)
+ return true
+}
+
+func roundUp(n int64) int64 {
+ tmp := n
+ base := int64(1)
+ for tmp >= 10 {
+ tmp /= 10
+ base *= 10
+ }
+ switch {
+ case n <= base:
+ return base
+ case n <= (2 * base):
+ return 2 * base
+ case n <= (5 * base):
+ return 5 * base
+ default:
+ return 10 * base
+ }
+ panic("unreachable")
+ return 0
+}
+
+func min(a, b int64) int64 {
+ if a < b {
+ return a
+ }
+ return b
+}
+
+func max(a, b int64) int64 {
+ if a > b {
+ return a
+ }
+ return b
+}