Go 性能优化技巧 3/10

内置 map 类型是必须的。首先,该类型使用频率很高;其次,可借助 runtime 实现深层次优化(比如说字符串转换,以及 GC 扫描等)。可尽管如此,也不意味着万事大吉,依旧有很多需特别注意的地方。

1.预设容量

map 会按需扩张,但须付出数据拷贝和重新哈希成本。如有可能,应尽可能预设足够容量空间,避免此类行为发生。

从结果看,预设容量的 map 显然性能更好,更极大减少了堆内存分配次数。

2.直接存储

对于小对象,直接将数据交由 map 保存,远比用指针高效。这不但减少了堆内存分配,关键还在于垃圾回收器不会扫描非指针类型 key/value 对象。

写个示例对比一下,注意调整 33 行的函数调用。

指针模式:

值模式:

从两次输出里 GC 所占时间百分比,就可看出 “巨大” 差异。

提示:map 对 key、value 数据存储长度有限制。

3.空间收缩

很遗憾,map 不会收缩 “不再使用” 的空间。就算把所有键值删除,它依然保留内存空间以待后用。

就算清空了所有数据,空间依旧没有释放。解决方法是取消 23 行注释,或者替换为一个新的 map 对象。

提示:如长期使用 map 对象(比如用作 cache 容器),偶尔换成 “新的” 或许会更好。还有,int key 要比 string key 更快。



最新动态,请扫码关注

时间: 2024-11-03 01:07:08

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

Go 性能优化技巧 8/10

尽管反射(reflect)存在性能问题,但依然被频繁使用,以弥补静态语言在动态行为上的不足.只是某些时候,我们须对此做些变通,以提升性能. 为便于阅读,以下示例均做了最大程度精简. 如果是 reflect.Type,可将其缓存,避免重复操作耗时.但 Value 显然不行,因为它和具体对象绑定,内部存储实例指针.换个思路,字段相对于结构,除名称(name)外,还有偏移量(offset)这个唯一属性.利用偏移量,将 FieldByName 变为普通指针操作,就可以实现性能提升. 测试一下优化成果.

Go 性能优化技巧 7/10

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

Go 性能优化技巧 9/10

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

Go 性能优化技巧 5/10

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

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(