2016-06-26 23 views
2

Ich Benchmark-Code mit verschiedenen Listengrößen (Listen der Größe S) Go Benchmark zeigt ns/op, aber was ich will ist (ns/op)/S.Kann golang benchmark eine benutzerdefinierte Ausgabe geben?

Mit anderen Worten, ist der Ausgang der go test -bench=.:

BenchmarkMy10-4   100000000   15.7 ns/op 
BenchmarkMy20-4   50000000   33.8 ns/op 
BenchmarkMy30-4   30000000   43.8 ns/op 
BenchmarkMy40-4   30000000   49.3 ns/op 
BenchmarkMy50-4   30000000   56.6 ns/op 
BenchmarkMy1000-4  2000000   686 ns/op 
BenchmarkMy10000-4  200000   6685 ns/op 
BenchmarkMy100000-4  20000   65425 ns/op 

Die "10" in "My10" steht für eine Liste der 10 Elemente (S = 10).

Während es nützlich ist, die ns/op für verschiedene Listengrößen zu kennen, möchte ich auch die ns/op/S (Zeit pro Element in der Liste) wissen.

Jetzt paste ich die Ergebnisse in eine Tabelle und mache die Mathematik dort. Ich hätte aber gern "go test", um diese Informationen für mich auszugeben.

Meine main_test.go Datei wie folgt aussieht:

import "testing" 

var result int 

func benchmarkMy(i int, b *testing.B) { 
    var r int 
    mylist := MakeList(i) 
    b.ResetTimer() 
    for n := 0; n < b.N; n++ { 
    r = My(mylist) 
    } 
    result = r 
} 

func BenchmarkMy10(b *testing.B)   { benchmarkMy(10, b) } 
func BenchmarkMy20(b *testing.B)   { benchmarkMy(20, b) } 
func BenchmarkMy30(b *testing.B)   { benchmarkMy(30, b) } 
func BenchmarkMy40(b *testing.B)   { benchmarkMy(40, b) } 
func BenchmarkMy50(b *testing.B)   { benchmarkMy(50, b) } 
func BenchmarkMy1000(b *testing.B)  { benchmarkMy(1000, b) } 
func BenchmarkMy10000(b *testing.B)  { benchmarkMy(10000, b) } 
func BenchmarkMy100000(b *testing.B)  { benchmarkMy(100000, b) } 

Es ist wie die test.BenchmarkResult Struktur scheint hat die Informationen, die ich brauche, aber ich sehe nicht, wie diese Struktur zu verwenden.

+0

Nein, Standard Benchmark kann dies nicht einfach tun, weil es nicht allgemein nützlich ist. ns/op/S könnte für Algorithmen interessant sein, die nur O (1) sind. – Volker

Antwort

3

Sie können einen benutzerdefinierten Benchmark mit Benchmark Funktion aus Paket testing schreiben. Und erhalten Sie eine BenchmarkResult Instanz, die Sie erwähnen.

package main 

import (
    "fmt" 
    "testing" 
) 

func benchmarkMy(i int) { 
    fn := func(b *testing.B) { 
     // Code you want benchmarked 
    } 
    r := testing.Benchmark(fn) 

    fmt.Printf("%d ns/op\n", int(r.T)/r.N) 
    fmt.Printf("%d ns/op/i\n", int(r.T)/r.N/i) 
} 

func main() { 
    benchmarkMy(10) 
} 

Sie müssen diese in einem anderen Paket setzen und mit go run statt go test laufen.

Überprüfen Sie ein Beispiel in der playground.

+0

Ich habe das vorher nicht getan und konnte nicht viele unterstützende Dokumente finden. Das scheint mir der Weg zu sein. –