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

Dak*_*san 5 optimization garbage-collection memory-management go

最近通过强时间优化的GC运行,优化代码以在golang GC中获得更好的结果似乎更为重要.我最近被告知它在运行中完成了多少"取决于你的堆内存使用模式."但是我并不确定从语言程序员的角度来看这意味着什么.或者这不是可以轻易控制的东西?

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

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

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

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

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

pet*_*rSO 6

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

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

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

BenchmarkOriginal      30000     44349 ns/op       52792 B/op      569 allocs/op
Run Code Online (Sandbox Code Playgroud)

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

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

BenchmarkOptimized    100000     13198 ns/op       32992 B/op        3 allocs/op
Run Code Online (Sandbox Code Playgroud)

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

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

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