预分配切片内存对 Golang 性能的影响 | Oilbeater 的学习室

主要观点:代码审查时常要求将var init []int64改为init := make([]int64, 0, length)格式以预分配切片内存,虽不知此改进对性能影响的量化概念,后介绍了预分配内存提升性能的理论基础、量化测量及自动检测工具。
关键信息

  • 理论基础:Golang 切片扩容实现在slice.go under growslice,容量小于 256 时每次扩容为原容量两倍,超过 256 时为原容量 1.25 倍,理论上预分配可避免重复分配等提升性能。
  • 量化测量:通过修改prealloc代码测量不同容量预分配和动态分配切片对性能的影响,结果显示在不同容量下预分配均有性能提升,容量越大提升倍数约 2 - 4 倍,且对复杂结构体性能差距更小。
  • Lint 工具 prealloc:大型项目中仅靠手动审查易疏忽,需自动代码扫描工具,[prealloc]可扫描未预分配的潜在切片,可集成到[golangci-lint]。
    重要细节
  • 测试代码通过go test -bench=. -benchmem prealloc_test.go执行,改变length可观察不同场景性能数据。
  • 文中提及之前关于[The Impact of Preallocating Slice Memory in Golang]的讨论及后续进一步测试的相关内容。
阅读 11
0 条评论