2012/09/14

Go言語で文字列の結合時間を計測してみた

文字列の結合時間を計測する

いろいろやり方はあると思うけど、今回は
  1. string型の + 演算子
  2. bytes.WriteString()
の 2 種類を計測してみた。

ソース

package main

import (
 "time"
 "fmt"
 "bytes"
)

var tests = []string {
 "Lorem ipsum dolor sit amet",
 "consectetur adipisicing elit",
 "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua",
 "Ut enim ad minim veniam",
 "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat",
}

func concat(times int) string{
 c := len(tests)
 s := ""
 for n := 0; n < times; n ++ {
  s += tests[n % c]
 }
 return s
}

func useBuffer(times int) string{
 c := len(tests)
 buffer := bytes.NewBuffer(make([]byte, 0, 256))
 for n := 0; n < times; n ++ {
  buffer.WriteString(tests[n % c])
 }
 return buffer.String()
}

func measure(loop, times int) {
 fmt.Println("--- loop:", loop, "times:", times, "---")

 start := time.Now()
 for n := 0; n < loop; n ++ {
  concat(times)
 }
 end := time.Now()
 fmt.Println("concat()", end.Sub(start).Nanoseconds(), "ns")

 start = time.Now()
 for n := 0; n < loop; n ++ {
  useBuffer(times)
 }
 end = time.Now()
 fmt.Println("useBuffer()", end.Sub(start).Nanoseconds(), "ns")
}

func main() {
 measure(10, 10000)
 measure(10000, 10)
}

結果

--- loop: 10 times: 10000 ---
concat() 5,199,967,000 ns
useBuffer() 8,865,000 ns
--- loop: 10000 times: 10 ---
concat() 28,796,000 ns
useBuffer() 17,667,000 ns

だいぶ差がつくとは思ったけど、ここまでとは...。
もしかしてたくさん bytes.NewBuffer() を呼ぶケースなら、+ 演算子の方が早いかな?という期待もあったけど、そうでもないみたい。

0 件のコメント:

コメントを投稿