Go 性能优化技巧 8/10

尽管反射(reflect)存在性能问题,但依然被频繁使用,以弥补静态语言在动态行为上的不足。只是某些时候,我们须对此做些变通,以提升性能。

为便于阅读,以下示例均做了最大程度精简。

如果是 reflect.Type,可将其缓存,避免重复操作耗时。但 Value 显然不行,因为它和具体对象绑定,内部存储实例指针。换个思路,字段相对于结构,除名称(name)外,还有偏移量(offset)这个唯一属性。利用偏移量,将 FieldByName 变为普通指针操作,就可以实现性能提升。

测试一下优化成果。

效果很好,不是吗?剩余的问题是,如何设计缓存结构,这个 offset 变量自然不能用于实际开发。

用 map[Type]map[name]offset?显然不行。每次执行 reflect.TypeOf,这于性能优化不利。可除了 Type,还有什么可以作为 Key 使用?要知道,接口由 itab 和 data 指针组成,相同类型(接口和实际类型组合)的 itab 指针相同,自然也可当作 key 来用。

虽因引入 map 导致性能有所下降,但相比直接使用 reflect 还是提升很多。

利用指针类型转换实现性能优化,本就是 “非常手段”,是一种为了性能而放弃 “其他” 的做法。与其担心代码是否适应未来的变化,不如写个单元测试,确保在升级时做出必要的安全检查。还有,本优化系列,仅仅提供一种优化思路,未必要照抄。

最新动态,请扫码关注

时间: 2024-10-06 03:59:21

Go 性能优化技巧 8/10的相关文章

Go 性能优化技巧 7/10

接口的用途无需多言.但这并不意味着可在任何场合使用接口,要知道通过接口调用和普通调用存在很大差别.首先,相比静态绑定,动态绑定性能要差很多:其次,运行期需额外开销,比如接口会复制对象,哪怕仅是个指针,也会在堆上增加一个需 GC 处理的目标. 显然,对于压力很大的内部组件之间,用接口有些得不偿失. 对比接口调用和普通调用的汇编指令,以便有个直观的认识. 普通调用被内联,但接口调用就没有这个待遇了. 就算在 ifaceCall 内部,依然需要通过接口相关机制完成调用. 好了,有关接口的更多细节就不是

Go 性能优化技巧 9/10

作为内置类型,通道(channel)从运行时得到很多支持,其自身设计也算得上精巧.但不管怎么说,它本质上依旧是一种队列,当多个 goroutine 并发操作时,免不了要使用锁.某些时候,这种竞争机制,会导致性能问题. 下面是一个简单利用 channel 收发数据的示例,为便于 "准确" 测量收发操作性能,我们将 make channel 操作放到外部,尽可能避免额外消耗. 在研究 go runtime 源码实现过程中,会看到大量利用 "批操作" 来提升性能的样例.在

Go 性能优化技巧 5/10

闭包(closure)也是很常见的编码模式,因它隐式携带上下文环境变量,因此可让算法代码变得更加简洁. 但任何 "便利" 和 "优雅" 的背后,往往都是更复杂的实现机制,无非是语法糖或编译器隐藏了相关细节.最终,这些都会变成额外成本在运行期由 CPU.runtime 负担.甚至因不合理使用,造成性能问题. 用几个代码片段看看可能的麻烦. 单次调用的性能差异有点大(不同环境结果会不同),但这会不会和匿名函数本身构建有关? 似乎是这样.可接下来的问题就更麻烦了.(代码仅

Go 性能优化技巧 3/10

内置 map 类型是必须的.首先,该类型使用频率很高:其次,可借助 runtime 实现深层次优化(比如说字符串转换,以及 GC 扫描等).可尽管如此,也不意味着万事大吉,依旧有很多需特别注意的地方. 1.预设容量 map 会按需扩张,但须付出数据拷贝和重新哈希成本.如有可能,应尽可能预设足够容量空间,避免此类行为发生. 从结果看,预设容量的 map 显然性能更好,更极大减少了堆内存分配次数. 2.直接存储 对于小对象,直接将数据交由 map 保存,远比用指针高效.这不但减少了堆内存分配,关键还

java性能优化技巧

一.通用篇 "通用篇"讨论的问题适合于大多数 Java应用. 1.1     new 1.1     new 11..11 不用 nneeww关键词创建类的实例 用new 关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如 果一个对象实现了Cloneable 接口,我们可以调用它的clone()方法.clone()方法不会调用任 何类构造函数. 在使用设计模式(Design Pattern)的场合,如果用 Factory模式创建对象,则改用clone() 方法创建新的

Java程序性能优化技巧

多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for循环Vector vect = new Vector(1000);for( inti=0; i<vect.size(); i++){ ...}for循环部分改写成:int size = vect.size();for( int i=0; i>size; i++){ ...} 如果size=1000,就可以减少1000次si

android App性能优化技巧浅谈

Android App性能优化,安卓App性能优化技巧,无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的.那么,如何能开发出更高性能的Android App?相信是软件开发公司以及广大程序员们头疼的一大难题.今天,就给大家提供几个提高Android App性能的技巧. 高效地利用线程1.在后台取消一些线程中的动作 我们知道App运行过程中所有的操作都默认在主线程(UI线程)中进行的,这样App的响应速度就会受

Oracle SQL 性能优化技巧

Select语句完整的执行顺序: SQL Select语句完整的执行顺序: 1. from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函数进行计算: 5.使用having子句筛选分组: 6.计算所有的表达式: 7. 使用order by对结果集进行排序 性能优化技巧 1.选用适合的ORACLE优化器      ORACLE的优化器共有3种 A.RULE (基于规则) b.COST (基于成本) c

Python 代码性能优化技巧(转)

原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进.在算法的时间复杂度排序上依次是: O(1) -> O(lg n) -> O(