golang 的 func 的反射使用,目前还没有很合适的优化手段
但是可以很巧妙地绕过对 func 的反射
我个人语文水平难以表达出来,所以举一个实例进行说明
gobench 测试大约 300 ns/op
type banana struct {
value int
value2 int
}
func apple(b *banana)int{
return b.value
}
func parse_func(fn interface{}) func() int{
fnt := reflect.TypeOf(fn)
fnv := reflect.ValueOf(fn)
param := fnt.In(0).Elem()
return func() int {
arg := reflect.New(param)
resp := fnv.Call([]reflect.Value{arg}) // 严重耗时
return resp[0].Interface().(int)
}
}
fn := parse_func(apple)
gobench 测试大约 50 ns/op
type banana struct {
value int
value2 int
}
type iBanana interface {
apple() int
}
func (b *banana) apple() int {
return b.value
}
func parse_func(b iBanana) func() int{
t := reflect.TypeOf(b)
param := t.Elem()
return func() int {
arg := reflect.New(param).Interface().(iBanana)
return arg.apple() // 无需反射
}
}
fn := parse_func(&banana{})
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.