网站首页 返回列表 “慢生活”不是懒惰,放慢速度不是拖延时间,而是让我们在生活中寻找到平衡。

Go 性能优化技巧 10/10
2020-06-10 11:46 admin go技巧

垃圾回收不是万能的,Go一样存在资源泄露问题。1SetFinalizer虽然垃圾回收器能很好地处理循环引用,可一旦加上SetFinalizer,事情就不那么美妙了。显然,这些对象并未被释放。在标准库文档里有这样的描述:>Finalizersarerunindependencyorder:ifApointsatB,bot...
阅读全文

Go性能优化技巧 1/10
2020-06-10 11:45 admin go技巧

字符串(string)作为一种不可变类型,在与字节数组(slice,[]byte)转换时需付出“沉重”代价,根本原因是对底层字节数组的复制。这种代价会在以万为单位的高并发压力下迅速放大,所以对它的优化常变成“必须”行为。首先,须了解string和[]byte数据结构,并确认默认方式的复制行为。>动态演示:https:/...
阅读全文

Go 性能优化技巧 2/10
2020-06-10 11:45 admin go技巧

对于一些初学者,自知道Go里面的array以pass-by-value方式传递后,就莫名地引起“恐慌”。外加诸多文章未作说明,就建议用slice代替array,企图避免数据拷贝,提升性能。实际上,此做法有待商榷。某些时候怕会适得其反,倒造成不必要的性能损失。用个简单的示例说明。代码很简单,两个函数分别返回“内容相同”的...
阅读全文

Go 性能优化技巧 3/10
2020-06-10 11:45 admin go技巧

内置map类型是必须的。首先,该类型使用频率很高;其次,可借助runtime实现深层次优化(比如说字符串转换,以及GC扫描等)。可尽管如此,也不意味着万事大吉,依旧有很多需特别注意的地方。1预设容量map会按需扩张,但须付出数据拷贝和重新哈希成本。如有可能,应尽可能预设足够容量空间,避免此类行为发生。从结果看,预设容量...
阅读全文

Go 性能优化技巧 4/10
2020-06-10 11:45 admin go技巧

延迟调用(defer)确实是一种“优雅”机制。可简化代码,并确保即便发生panic依然会被执行。如将panic/recover比作try/except,那么defer似乎可看做finally。如同异常保护被滥用一样,defer被无限制使用的例子比比皆是。只需稍稍了解defer实现机制,就不难理解会有这样的性能差异。编译...
阅读全文

Go 性能优化技巧 5/10
2020-06-10 11:45 admin go技巧

闭包(closure)也是很常见的编码模式,因它隐式携带上下文环境变量,因此可让算法代码变得更加简洁。但任何“便利”和“优雅”的背后,往往都是更复杂的实现机制,无非是语法糖或编译器隐藏了相关细节。最终,这些都会变成额外成本在运行期由CPU、runtime负担。甚至因不合理使用,造成性能问题。用几个代码片段看看可能的麻烦...
阅读全文

Go 性能优化技巧 6/10
2020-06-10 11:45 admin go技巧

Go使用channel实现CSP模型。处理双方仅关注通道和数据本身,无需理会对方身份和数量,以此实现结构性解耦。在各文宣中都有“Don'tcommunicatebysharingmemory,sharememorybycommunicating.”这类说法。但这并非鼓励我们不分场合,教条地使用channel。在我看来,...
阅读全文

Go 性能优化技巧 7/10
2020-06-10 11:45 admin go技巧

接口的用途无需多言。但这并不意味着可在任何场合使用接口,要知道通过接口调用和普通调用存在很大差别。首先,相比静态绑定,动态绑定性能要差很多;其次,运行期需额外开销,比如接口会复制对象,哪怕仅是个指针,也会在堆上增加一个需GC处理的目标。显然,对于压力很大的内部组件之间,用接口有些得不偿失。对比接口调用和普通调用的汇编指...
阅读全文

Go 性能优化技巧 8/10
2020-06-10 11:45 admin go技巧

尽管反射(reflect)存在性能问题,但依然被频繁使用,以弥补静态语言在动态行为上的不足。只是某些时候,我们须对此做些变通,以提升性能。为便于阅读,以下示例均做了最大程度精简。如果是reflect.Type,可将其缓存,避免重复操作耗时。但Value显然不行,因为它和具体对象绑定,内部存储实例指针。换个思路,字段相对...
阅读全文

Go 性能优化技巧 9/10
2020-06-10 11:45 admin go技巧

作为内置类型,通道(channel)从运行时得到很多支持,其自身设计也算得上精巧。但不管怎么说,它本质上依旧是一种队列,当多个goroutine并发操作时,免不了要使用锁。某些时候,这种竞争机制,会导致性能问题。下面是一个简单利用channel收发数据的示例,为便于“准确”测量收发操作性能,我们将makechannel...
阅读全文
顶部 底部