尽管反射(reflect)存在性能问题,但依然被频繁使用,以弥补静态语言在动态行为上的不足。只是某些时候,咱们须对此作些变通,以提高性能。缓存
为便于阅读,如下示例均作了最大程度精简。安全
若是是 reflect.Type,可将其缓存,避免重复操做耗时。但 Value 显然不行,由于它和具体对象绑定,内部存储实例指针。换个思路,字段相对于结构,除名称(name)外,还有偏移量(offset)这个惟一属性。利用偏移量,将 FieldByName 变为普通指针操做,就能够实现性能提高。性能优化
测试一下优化成果。性能
效果很好,不是吗?剩余的问题是,如何设计缓存结构,这个 offset 变量天然不能用于实际开发。单元测试
用 map[Type]map[name]offset?显然不行。每次执行 reflect.TypeOf,这于性能优化不利。可除了 Type,还有什么能够做为 Key 使用?要知道,接口由 itab 和 data 指针组成,相同类型(接口和实际类型组合)的 itab 指针相同,天然也可看成 key 来用。测试
虽因引入 map 致使性能有所降低,但相比直接使用 reflect 仍是提高不少。优化
利用指针类型转换实现性能优化,本就是 “很是手段”,是一种为了性能而放弃 “其余” 的作法。与其担忧代码是否适应将来的变化,不如写个单元测试,确保在升级时作出必要的安全检查。还有,本优化系列,仅仅提供一种优化思路,未必要照抄。spa
最新动态,请扫码关注设计