高质量编程与性能调优实战(2) | 青训营

100 阅读2分钟

这是我在第六届字节跳动青训营后端进阶班的第八篇笔记,主要梳理Go语言性能调优部分的课程内容。

性能优化建议

性能优化是综合评估,有时候时间效率和空间效率可能对立。性能优化的前提是满足正确可靠、简洁清晰等质量因素。下面针对Go语言特性,介绍Go相关的性能优化建议:

  • Benchmark:性能表现需要实际数据衡量,对此Go语言提供了支持基准性能测试的Benchmark工具;
  • slice预分配内存:尽可能在使用make()初始化切片时提供容量信息;
  • map预分配内存:不断向map中添加元素的操作会触发map的扩容,提前分配好空间可以减少内存拷贝和Rehash的消耗,建议根据实际需求提前预估好需要的空间;
  • 使用String.Builder:常见的字符串拼接方式,相比用+或bytes.Buffer拼接具有更高的性能,使用+需要每次重新分配内存,而String.Builder应用内存扩容策略;
  • 使用空间结构体节省内存:空结构体struct{}实例不占据任何的内存空间,可作为各种场景下的占位符使用;
  • 使用atomic包:锁的实现是通过操作系统来实现,属于系统调用,而atomic操作是通过硬件实现,效率比锁高,且对于非数值操作,可以使用atomic.Value, 能承载一个interface{}。

总之,避免常见的性能陷阱可以保证大部分程序的性能,而普通应用代码, 不要一味地追求程序的性能;且越高级的性能优化手段越容易出现问题,还要在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能。

性能调优实战

在实战过程中,我们应该遵守以下性能调优原则:

  • 要依靠数据而不是猜测;
  • 要定位最大瓶颈而不是细枝末节;
  • 不要过早、过度优化。

要想知道应用在什么地方耗费了多少CPU、内存,可以使用pprof工具,pprof是用于可视化和分析性能分析数据的工具,具体可见github.com/wolfogre/go…