Let’s say that you want to know if EncodeToString is faster than fmt.Sprintf : you will need to compare the speed of this method
func Md5Encode(str string) string {
md5HashInBytes := md5.Sum([]byte(str))
md5HashInString := hex.EncodeToString(md5HashInBytes[:])
return md5HashInString
}
with this other one
func Md5EncodeFmt(str string) string {
md5HashInBytes := md5.Sum([]byte(str))
md5HashInString := fmt.Sprintf("%x", md5HashInBytes)
return md5HashInString
}
Go provides benchmarking features in the testing package which is pretty usefull :
func BenchmarkMd5EncodeFmt(b *testing.B) {
// run the md5Encode function b.N times
for n := 0; n < b.N; n++ {
Md5EncodeFmt("aldfhasdl la fasdfeo8ekldjh asdkj fh lksdjfhwoieuxnroiAUN;laiDJ;ANIfub;OEIRBUF;OEfuN;ALFJ;AL")
}
}
func BenchmarkMd5Encode(b *testing.B) {
// run the md5Encode function b.N times
for n := 0; n < b.N; n++ {
Md5Encode("aldfhasdl la fasdfeo8ekldjh asdkj fh lksdjfhwoieuxnroiAUN;laiDJ;ANIfub;OEIRBUF;OEfuN;ALFJ;AL")
}
}
Run
$ go test -bench=.
goos: linux
goarch: amd64
BenchmarkMd5EncodeFmt-8 1894791 625 ns/op
BenchmarkMd5Encode-8 3068509 363 ns/op
PASS
ok _/home/paul/LazyInit/bench 3.342s
Run 3 times the benchmarks :
$ go test -count 3 -bench=.
goos: linux
goarch: amd64
BenchmarkMd5EncodeFmt-8 1882105 627 ns/op
BenchmarkMd5EncodeFmt-8 1918942 624 ns/op
BenchmarkMd5EncodeFmt-8 1902894 625 ns/op
BenchmarkMd5Encode-8 3139585 386 ns/op
BenchmarkMd5Encode-8 2937154 397 ns/op
BenchmarkMd5Encode-8 3009801 380 ns/op
PASS
ok _/home/paul/LazyInit/bench 10.217s
EncodeToString() makes your method almost twice faster !
In the case you need to isolate the code that will be measured from some init/fixture code you can use ResetTimer() and StopTimer() to accurately isolate what you want to measure :
func BenchmarkMd5EncodeFmt(b *testing.B) {
// Some init code
initRandomBenchStrings()
b.ResetTimer()
for n := 0; n < b.N; n++ {
Md5EncodeFmt(getRandomstrings())
}
b.StopTimer()
// some final code
}
If the function you’re measuring is very slow you might want to increase to maximum time of excecution of the benchmark (default is 1 s) with -benchtime=20s
Recap
- without any benchmarks :
go test .
- with benchmarks (time) :
go test -bench .
- with benchmarks (time and memory) :
go test -bench . -benchmem
The argument following -bench
is a regular expression. All benchmark functions whose names match are executed. The .
in the previous examples isn’t the current directory but a pattern matching all tests. To run a specific benchmark, use the regexp : -bench Suite
(means everything containing Suite).
(thanks to https://github.com/samonzeweb/profilinggo )