Chase Mao's blog

Go 反射调用函数性能损失

2024-03-20

通过反射调用函数,比直接调用约慢了1000倍。是否提前保存函数的反射对象,对性能几乎没有影响,即耗时集中在调用反射对象的Call方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
func f() {}

func BenchmarkDirect(b *testing.B) {
	for i := 0; i < b.N; i++ {
		f()
	}
}

func BenchmarkReflectOnlyRun(b *testing.B) {
	fv := reflect.ValueOf(f)
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		fv.Call(nil)
	}
}

func BenchmarkReflect(b *testing.B) {
	for i := 0; i < b.N; i++ {
		fv := reflect.ValueOf(f)
		fv.Call(nil)
	}
}

Output is

1
2
3
BenchmarkDirect                 1000000000           0.2425 ns/op
BenchmarkReflectOnlyRun         100000000            107.8 ns/op
BenchmarkReflect                100000000            108.9 ns/op