GO语言性能优化&和自动内存管理注意事项 | 青训营笔记

92 阅读2分钟

Go语言性能优化和自动内存管理注意事项

业务层优化:

  1. 针对特定场景,具体问题,具体分析
  2. 比较容易获得较大性能收益

语言运行时优化:

  1. 解决更通用的性能问题
  2. 需要考虑更多的场景
  3. Tradeoffs
  4. 内存分配,代码质量等

数据驱动:

  1. 自动化性能分析工具 -- pprof
  2. 依靠数据而非猜测
  3. 首先解决耗时,耗内存最大的部分

减少内存分配

  1. 避免过度分配内存。Go语言的垃圾回收机制会定期回收无用内存,但分配过多内存还是会降低性能。所以应避免在热循环内分配内存。
  2. 用指针代替大结构体。传递指针而不是结构体可以减少内存分配和复制。

管理临时对象

  1. sync.Pool管理临时对象。sync.Pool可以重用临时对象,避免频繁分配内存。

减少内存抖动

  1. 避免引起内存抖动。内存抖动会触发垃圾回收并降低性能。可以重用内存、分配恒定大小的内存等方法减少内存抖动。

减少指针追踪

  1. 减少无用指针。垃圾回收器会追踪指针来找到所有达到对象,减少无用指针可以提高垃圾回收效率。

使用高效的并发结构

  1. sync.Map代替map并发操作。sync.Map内部使用锁实现并发安全,会比map并发操作性能更好。
  2. 避免channel和map的并发读写。这会引起竞态条件和降低性能。

避免在热点调用昂贵函数

  1. 避免在内层循环中调用fmt等函数。这些函数会导致内存分配,应避免在热点循环中调用。## 分析和优化瓶颈
  2. Profile并优化瓶颈代码。使用pprofProfile工具分析并找到性能瓶颈,然后对瓶颈代码进行优化。

选择高效数据结构和算法

  1. 选择更高效的数据结构和算法。选择合适的数据结构和算法也是性能优化的关键。
  2. 总之,Go语言性能优化主要通过减少内存分配、避免内存抖动、使用高效并发结构等手段来实现。而Go的自动内存管理也要配合程序员的优化才能达到更高性能。