memoメモ

最近はGo言語関連で。φ(..)メモメモ

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

プログラミング言語Goフレーズブック

プログラミング言語Goフレーズブック

  • 作者: David Chisnall,デイビッド・チズナール,柴田芳樹
  • 出版社/メーカー: ピアソン桐原
  • 発売日: 2012/10/04
  • メディア: 単行本(ソフトカバー)
  • 購入: 1人 クリック: 5回
  • この商品を含むブログを見る

基礎からわかる Go言語

基礎からわかる Go言語

Programming in Go: Creating Applications for the 21st Century (Developer's Library)

Programming in Go: Creating Applications for the 21st Century (Developer's Library)