ベンチマークを使うほどでもないけど、ちょっと関数ごとの処理時間を知りたい。
そんなとき用の計測コードを書いたので覚書き。
まず欲しいのは計測したい関数や区間の処理時間です。
わかりやすいように名前付きで、全体の時間も併せて表示するようにします。
ついでに全体でのメモリ使用量も表示してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package main import( "fmt" "runtime" "time" ) type tm struct{ name string measure time.Duration } var ( times = make([]tm,0,100) mem_s runtime.MemStats mem_e runtime.MemStats ) func main() { //スタート時のメモリ使用量 runtime.ReadMemStats(&mem_s) //スタート時刻 start := time.Now() //計測結果を追加する func1() times = append(times,tm{"func1",time.Since(start)}) func2() times = append(times,tm{"func2",time.Since(start)}) func3() times = append(times,tm{"func3",time.Since(start)}) //終了時のメモリ使用量 runtime.ReadMemStats(&mem_e) //メモリ増加分を出力 fmt.Printf("Memory : %f MB\n", float64(mem_e.Alloc-mem_s.Alloc)/float64(1024*1024)) //計測時間(秒)を出力 tmp := 0.0 for _,v := range times{ //関数ごとの時間と全体の時間を表示 fmt.Printf("%2.8f / %2.8f sec <= %s\n", v.measure.Seconds()-tmp, v.measure.Seconds(), v.name) tmp = v.measure.Seconds() } } |
最初に計測コードを書いたときはmapで書きましたが、順番が前後するのを忘れてたので構造体のスライスを使用しました。
計測用のコードでmalloc
して重くなるのも嫌なのでmake
で適当な量取ってます。
func2
がやや重いくらいのことがわかりますね。
構造体tm
にメモリ使用量を追加すると関数ごとの増加量とかも見れます。
GOは比較的早いので処理時間を気にしない場合が多いですが、ちょくちょく見てみた方がいい気がします。