62
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Goでは文字列連結はコストの高い操作

Last updated at Posted at 2014-08-31

Goでは文字列は不変(immutable)なので、文字列への文字の追加は常に新しい文字列をアロケートすることになる。ランタイムはまず新しい文字列のためのメモリを割り当てて、そこに既存の文字列の内容をコピーし、新しい文字を最後に足すということを行う。

従って、文字列に+=演算子で文字列を追加していく操作は大変効率が悪い。Javaの文字列も同じだからJavaプログラマにとっては馴染みのある話だろうと思う。

文字列を構築する必要がある場合、[]byte型の値を作ってそれに文字列を追加していって、最後に値を文字列に変換するのがよい。

// サイズ0、内部バッファの長さ10の[]byteの値を割り当てる
b := make([]byte, 0, 10)

// bに文字列を追加
b = append(b, "foo"...) // ...が必要
b = append(b, "bar"...)
return string(b)

上のコードでは、10バイトのバッファを持った値bを最初に割り当てている。bは10バイトと短いのでスタックに割り付けられる(ヒープ割り当てよりスタック割り当てのほうが速いので、これはよいこと)。その後バッファを埋めていっているが、"foo"と"bar"は合わせて6バイトなのでbが再割り当てされることはない。従って上のコードでヒープにメモリが割り当てられるのは、最後に[]byteをstringに変換しているところだけになり、効率が良い。

もしバッファが途中で10バイトより長くなればbはヒープに移されるので、そういう文字列もきちんと構築することができる。

いずれにせよ文字列を連結するよりはこちらのほうが効率的なやり方だ。

62
57
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
62
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?