Go言語の練習〜Benchmark

昨日書いたGoで文字列を適当に圧縮する関数のベンチマークを取ってみた。

package main

import "testing"

func BenchmarkCompressBadStrA(b *testing.B) {
	for i := 0; i < b.N; i += 1 {
		CompressBad(strA)
	}
}

func BenchmarkCompressBetterStrA(b *testing.B) {
	for i := 0; i < b.N; i += 1 {
		CompressBetter(strA)
	}
}

func BenchmarkCompressAlternateStrA(b *testing.B) {
	for i := 0; i < b.N; i += 1 {
		CompressAlternate(strA)
	}
}

func BenchmarkCompressBadStrB(b *testing.B) {
	for i := 0; i < b.N; i += 1 {
		CompressBad(strB)
	}
}

func BenchmarkCompressBetterStrB(b *testing.B) {
	for i := 0; i < b.N; i += 1 {
		CompressBetter(strB)
	}
}

func BenchmarkCompressAlternateStrB(b *testing.B) {
	for i := 0; i < b.N; i += 1 {
		CompressAlternate(strB)
	}
}
$ go test -benchmem -bench .
testing: warning: no tests to run
PASS
BenchmarkCompressBadStrA	 1000000	      1385 ns/op	     128 B/op	      13 allocs/op
BenchmarkCompressBetterStrA	 1000000	      1034 ns/op	     168 B/op	       8 allocs/op
BenchmarkCompressAlternateStrA	 1000000	      1113 ns/op	      96 B/op	       8 allocs/op
BenchmarkCompressBadStrB	 1000000	      2183 ns/op	     216 B/op	      18 allocs/op
BenchmarkCompressBetterStrB	 1000000	      1735 ns/op	     208 B/op	      10 allocs/op
BenchmarkCompressAlternateStrB	 1000000	      1663 ns/op	     128 B/op	      10 allocs/op

やっぱ文字列を+で連結するよりは bytes.Bufferを使うほうが速いみたい。
runeのスライスを使うのとbytes.Bufferはあまり差が無い。


関連 : Go言語の練習 〜 文字列の基本的な圧縮 - brainstorm