2012/09/14

ちなみに

strings.Join() のコードを参考に、文字列結合のコードを書くとこんな感じ。
func likeJoin(times int) string {
 c := len(tests)

 // 結合後の byte 数を得る
 size := 0
 for n := 0; n < times; n++ {
  size += len(tests[n%c])
 }

 // バッファを必要な分確保する
 buffer := make([]byte, size)

 // 文字列のコピー
 bp := 0
 for n := 0; n < times; n++ {
  bp += copy(buffer[bp:], tests[n%c])
 }

 return string(buffer)
}

で、結果は
--- loop: 10 times: 10000 ---
concat() 5,168,710,000 ns
useBuffer() 8,419,000 ns
likeJoin() 6,055,000 ns
--- loop: 10000 times: 10 ---
concat() 27,746,000 ns
useBuffer() 18,199,000 ns
likeJoin() 10,946,000 ns
と、likeJoin()が一番速かった。
一見、ループが無駄っぽいけど、メモリの再割当てに比べればずっと実行コストは安いってことね。

0 件のコメント:

コメントを投稿