Go言語で効率良く文字列を連結する話 #golang
Go言語での話ですが、他の言語でも似た話があります。
文字列の連結で何気なく+(プラス演算子)を使ってしまうことがありますが、連続する場合は気をつける必要があります。 たとえば以下のコード:
func StringBuild_bad() string { str := "" for i := 0; i < 1000; i++ { str += "a" } return str }
とした場合、連結するごとに文字列オブジェクトが生成されます。これは、Javaでも同じことです。 次に、bytesパッケージを使ってみます:
func StringBuild_good() string { var buffer bytes.Buffer for i := 0; i < 1000; i++ { buffer.WriteString("a") } return buffer.String() }
こうすると、バッファ内に文字列が保持されるため、文字列オブジェクトが無駄に生成されることを防ぐことができます。JavaではStringBufferなどを使って効率化します。
ベンチマークの結果は。。。:
$ go test -test.bench Bench -test.benchmem testing: warning: no tests to run PASS BenchmarkStringBuild_bad 10000 284844 ns/op 545081 B/op 1000 allocs/op BenchmarkStringBuild_good 50000 34119 ns/op 3341 B/op 6 allocs/op ok github.com/atotto/tmp 4.965s
速度、メモリ割り当ての回数共に全然違いますね!
今回のコードはこちらからどうぞ: https://gist.github.com/atotto/5452948
- 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
- 出版社/メーカー: ピアソン桐原
- 発売日: 2012/10/04
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 5回
- この商品を含むブログを見る
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/11/21
- メディア: 単行本(ソフトカバー)
- クリック: 7回
- この商品を含むブログ (2件) を見る
Programming in Go: Creating Applications for the 21st Century (Developer's Library)
- 作者: Mark Summerfield
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2012/05/01
- メディア: Kindle版
- この商品を含むブログを見る