文字列の結合時間を計測する
いろいろやり方はあると思うけど、今回は- string型の + 演算子
- bytes.WriteString()
ソース
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 件のコメント:
コメントを投稿