小编典典

如何在Go中最小化垃圾回收?

go

有时您可能想要避免/最小化垃圾收集器,因此我想确定如何做。

我认为下一个是正确的:

  • 在函数的开头声明变量。
  • 使用数组而不是切片。

还有吗


阅读 274

收藏
2020-07-02

共1个答案

小编典典

避免垃圾相对简单。您需要了解在哪里进行分配,并查看是否可以避免分配。

首先,在函数开头声明变量将无济于事。编译器不知道区别。但是,人类会知道其中的区别,并且会惹恼他们。

使用数组而不是切片将是可行的,但这是因为将数组(除非取消引用)放置在堆栈中。数组还有其他问题,例如在函数之间按值(复制)传递数组。堆栈上的所有内容都不是“垃圾”,因为当函数返回时它将被释放。任何可能逃避该函数的指针或切片都会放在堆上,垃圾回收器必须在某些时候处理该堆。

您可以做的最好的事情就是避免分配。用完不需要的大量数据后,请重新使用它们。这是Go博客上的性能分析教程中使用的方法。我建议阅读。

除了概要分析教程中的示例外,还有另一个示例:假设您有一个[]int名为的类型切片xs。您将不断添加到,[]int直到达到条件,然后将其重置,以便重新开始。如果这样做xs = nil,则现在将切片的基础数组声明为要收集的垃圾。然后,Append将在您下次使用它时重新分配xs。相反xs = xs[:0],如果您这样做,则仍在重置它,但保留旧数组。

在大多数情况下,避免产生垃圾是过早的优化。对于大多数代码而言,这无关紧要。但是您可能偶尔会发现一个函数,该函数被调用很多次,每次运行时分配很多。或者是一个循环,您可以重新分配而不是重复使用。我会等到你看到瓶颈后再着手。

2020-07-02