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
}