読者です 読者をやめる 読者になる 読者になる

Go言語 / golangでreflectでメソッドを呼ぶと遅い

Go言語 / golang 雑記 Go言語入門 / golang 入門

f:id:nasust:20161227182643j:plain

こんにちはnasustです。
昨日の記事でオレオレMVCのプロトタイプを開発すると書きました。

nasust.hatenablog.com

それで、Ruby on Railsのアクションみたいにメソッドを呼び出す場合のパフォーマンスを計測してみました。

package main

import (
    "reflect"
    "testing"
)

type Handle func()

type Hoge struct {
}

func (self *Hoge) Handle() {
    for i := 0; i < 1000; i++ {
    }
}

func BenchmarkDirect(b *testing.B) {
    hoge := &Hoge{}

    handleMap := map[string]Handle{}
    handleMap["/"] = hoge.Handle

    for i := 0; i < b.N; i++ {
        handleFunc := handleMap["/"]
        handleFunc()
    }
}

func BenchmarkReflect(b *testing.B) {
    var hoge interface{} = &Hoge{}

    hogeVof := reflect.ValueOf(hoge)
    methodVof := hogeVof.Method(0)

    for i := 0; i < b.N; i++ {
        methodVof.Call(nil)
    }
}
BenchmarkDirect-3      3000000        425 ns/op
BenchmarkReflect-3     2000000        627 ns/op

ちょっと遅いですね。通常の関数呼び出しより1.5倍程度掛かりますね。 mapのような感じで、urlアクション実装した方が速そうです。

これとは別にオレオレMVC開発はパフォーマンスを良くしたいのでマルチスレッドで関連の機能を検証しましたが、簡単に出来るのでGo言語は良いですね。

広告を非表示にする