reflectでメソッドを呼ぶと遅い

created byTakuya Ueda. Licensed under the Creative Commons 3.0 Attributions license.

こんにちはnasustです。リフレクションでメソッドを呼び出すパフォーマンスを計測してみました。

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)
	}
}
go
BenchmarkDirect-3      3000000        425 ns/op
BenchmarkReflect-3     2000000        627 ns/op
bash

ちょっと遅いですね。通常の関数呼び出しより1.5倍程度掛かりますね。

prevnext