加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

优化 – 如何有效地构建golang程序以实现最佳垃圾收集器运行?

发布时间:2020-12-16 09:26:25 所属栏目:大数据 来源:网络整理
导读:最近通过强时间优化的GC运行,优化代码以在golang GC中获得更好的结果似乎更为重要.我最近被告知它在运行中完成了多少“取决于你的堆内存使用模式.”但是我并不确定从语言程序员的角度来看这意味着什么.或者这不是可以轻易控制的东西? 我已经阅读了Brian W.
最近通过强时间优化的GC运行,优化代码以在golang GC中获得更好的结果似乎更为重要.我最近被告知它在运行中完成了多少“取决于你的堆内存使用模式.”但是我并不确定从语言程序员的角度来看这意味着什么.或者这不是可以轻易控制的东西?

我已经阅读了Brian W. Kernighan最近出版的“The Go Programming Language”一书,但其中没有关于这个主题的内容.互联网上关于这个主题的所有信息都是几年前的,所以不要真正适用.

我目前做的一些事情包括:

>确保指针/对象只存储/记住它们需要的位置
>分配具有预期或理智能力的对象
>不重复数据
>能够时,通过函数使用流数据,而不是将所有数据预先放入大堆中.

我也有点恼火的是,在一个或另一个之间转换时总是重新创建字符串和字节数组(由于字符串是不可变的).因此,当我从一个到另一个,并且它是一个安全的操作时,我只是使用unsafe重新指向另一个类型的指针.

所有这些实践都值得帮助GC更快更清晰地运行吗?还有什么我可以做的吗?

解决方法

如果这只是一个简单的事情和注意事项,我们可以简单地编写一个程序来优化内存使用.

第一步是编写正确,设计良好,可维护且易于阅读的代码.

接下来,使用Go的测试包,对关键功能进行基准测试.例如.一个真实的案例,

BenchmarkOriginal      30000     44349 ns/op       52792 B/op      569 allocs/op

使用Go的个人资料工具.阅读源代码和可执行代码以查看发生了什么.

实现策略,例如单个底层数组和完整切片表达式,以减少GC内存分配和CPU时间.运行最终基准.

BenchmarkOptimized    100000     13198 ns/op       32992 B/op        3 allocs/op

在这种情况下,三角形阵列的569个元素分配减少到3个分配,分配减少99%,CPU时间相应减少70%.垃圾收集器(GC)也要少得多.

当然,这使代码更难阅读(更复杂,更模糊??),因此难以维护.

不要过度优化.你真的没有更好的事吗?最好的优化通常是购买更大的计算机.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读