垃圾收集

你不止一次支付内存分配。第一个显然是你分配它的时候。但是,每次垃圾收集运行时,你也要付出代价。

减少回收再利用。 - @bboreham

  • 堆栈与堆分配
  • 什么导致堆分配?
  • 了解逃逸分析(和当前的限制)
  • /debug/pprof/heap和-base
  • API设计限制分配:允许传入缓冲区,因此调用者可以重用而不是强制分配
  • 你甚至可以在扫描时仔细修改切片
  • 减少指针以减少gc扫描时间
  • 无指针的map键
  • GOGC
  • 缓冲区重用(sync.Pool vs或通过go-slab等自定义)
  • 切片与偏移量:当GC运行时指针写入需要writebarrier:https : //github.com/golang/go/commit/b85433975aedc2be2971093b6bbb0a7dc264c8fd
  • 使用错误变量而不是errors.New()/ fmt.Errorf()在呼叫站点(性能或风格?接口需要指针,所以它转义为堆)
  • 使用结构化的错误来减少分配(传递结构值),在错误打印时创建字符串
  • 大小端