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

こんにちは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)
	}
}
BenchmarkDirect-3      3000000        425 ns/op
BenchmarkReflect-3     2000000        627 ns/op

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

iOS、Android、Web、APIサーバーなどのフロントエンド・バックエンドを開発するソフトウェアエンジニアです。 UI/UXが好きです。かっこいいUIやWebデザインを眺めるのが趣味です。 このブログはソフトウェア開発関係の内容を記事にしています。
web service:
GitHubQiitaTwitterはてなブログ
handle name:
nasust
real name:
hideki mori
job:
ソフトウェアエンジニア
develop:
target: ios, android, web page, single page application, api server, system service, cli tool, linux embedded device

lang: c/c++, go, swift, objective-c, java, kotlin, typescript, dart, javascript, ruby, python, php

tool: vscode, xcode, android studio, photoshop, vim, docker