Go 性能优化技巧 8/10
2016-05-04 13:45
337 查看
尽管反射(reflect)存在性能问题,但依然被频繁使用,以弥补静态语言在动态行为上的不足。只是某些时候,我们须对此做些变通,以提升性能。
为便于阅读,以下示例均做了最大程度精简。
如果是 reflect.Type,可将其缓存,避免重复操作耗时。但 Value 显然不行,因为它和具体对象绑定,内部存储实例指针。换个思路,字段相对于结构,除名称(name)外,还有偏移量(offset)这个唯一属性。利用偏移量,将 FieldByName 变为普通指针操作,就可以实现性能提升。
测试一下优化成果。
效果很好,不是吗?剩余的问题是,如何设计缓存结构,这个 offset 变量自然不能用于实际开发。
用 map[Type]map[name]offset?显然不行。每次执行 reflect.TypeOf,这于性能优化不利。可除了 Type,还有什么可以作为 Key 使用?要知道,接口由 itab 和 data 指针组成,相同类型(接口和实际类型组合)的 itab 指针相同,自然也可当作 key 来用。
虽因引入 map 导致性能有所下降,但相比直接使用 reflect 还是提升很多。
利用指针类型转换实现性能优化,本就是 “非常手段”,是一种为了性能而放弃 “其他” 的做法。与其担心代码是否适应未来的变化,不如写个单元测试,确保在升级时做出必要的安全检查。还有,本优化系列,仅仅提供一种优化思路,未必要照抄。
最新动态,请扫码关注
为便于阅读,以下示例均做了最大程度精简。
如果是 reflect.Type,可将其缓存,避免重复操作耗时。但 Value 显然不行,因为它和具体对象绑定,内部存储实例指针。换个思路,字段相对于结构,除名称(name)外,还有偏移量(offset)这个唯一属性。利用偏移量,将 FieldByName 变为普通指针操作,就可以实现性能提升。
测试一下优化成果。
效果很好,不是吗?剩余的问题是,如何设计缓存结构,这个 offset 变量自然不能用于实际开发。
用 map[Type]map[name]offset?显然不行。每次执行 reflect.TypeOf,这于性能优化不利。可除了 Type,还有什么可以作为 Key 使用?要知道,接口由 itab 和 data 指针组成,相同类型(接口和实际类型组合)的 itab 指针相同,自然也可当作 key 来用。
虽因引入 map 导致性能有所下降,但相比直接使用 reflect 还是提升很多。
利用指针类型转换实现性能优化,本就是 “非常手段”,是一种为了性能而放弃 “其他” 的做法。与其担心代码是否适应未来的变化,不如写个单元测试,确保在升级时做出必要的安全检查。还有,本优化系列,仅仅提供一种优化思路,未必要照抄。
最新动态,请扫码关注
相关文章推荐
- 深入理解PHP7内核之FAST_ZPP
- MySQL 优化
- Google排名优化的几个影响因素
- 选定虚拟主机 性能凸显优势
- DB2优化(简易版)
- 修改一行代码提升 Postgres 性能 100 倍
- Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
- Flex 性能优化常用手法总结
- C#中尾递归的使用、优化及编译器优化
- 对优化Ruby on Rails性能的一些办法的探究
- 优化Ruby脚本效率实例分享
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- oracle 性能优化建议小结
- 推荐Sql server一些常见性能问题的解决方法
- Lua性能优化技巧(一):前言
- Lua性能优化技巧(五):削减、重用和回收
- Lua性能优化技巧(三):关于表
- Lua性能优化技巧(四):关于字符串
- Asp编码优化技巧
- SQL Server误区30日谈 第9天 数据库文件收缩不会影响性能