お世話になっております。
しゃまとんです。
ふと、golangでもこんな感じでメソッドって呼べないのかなーと調べてみたんですが、そんないい話はありませんでした。
golangではreflectというパッケージでリフレクションすることができるようになっています(説明になっていない)。そちらでやりたげなことは出来そうなんですが、reflectは重いという噂から、どうなんだろうということで簡単に比較してみました。
golangで文字列的にメソッドを呼ぶにはreflect.MethodByNameを利用して実現できそうです。いけるかな、いけないかな。
さて、検証簡単にベンチマークをとりました。
コードは下記です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package main import ( "testing" "reflect" "time" ) var t = time.Now() var r = reflect.ValueOf(t) func BenchmarkCall(b *testing.B) { for n := 0; n < b.N; n++ { t.UnixNano() } } func BenchmarkReflect(b *testing.B) { for n := 0; n < b.N; n++ { r.MethodByName("UnixNano").Call(nil) } } |
実行結果はこんな感じ。
全然速度違いますね。。
1 2 |
BenchmarkCall-4 2000000000 0.49 ns/op 0 B/op 0 allocs/op BenchmarkReflect-4 1000000 1577 ns/op 192 B/op 7 allocs/op |
普通に使っている程度だと、使わないですが込み入ったことをするとreflectが登場してくるので使うときは気をつけないとですね。
以上です。
■ 参考