Skip to content

GC 优化实战 ​

难度:⭐⭐⭐ 困难 ​

考点 ​

  • 减少堆分配的具体手法
  • strings.Builder vs += 拼接
  • sync.Pool 对象复用
  • 预分配 vs 动态增长

提示 ​

  1. ProcessData:一次性 make([]int, len) 代替反复 append
  2. ConcatStrings:用 strings.Builder
  3. ObjectPool:sync.Pool + Get/Put 复用 buffer
  4. 用 benchmark 的 -benchmem 验证分配次数减少

参考答案(Go) ​

点击展开参考答案
go
//go:build ignore

package answer

import (
	"strings"
	"sync"
)

func ProcessData_Good(inputs []int) []int {
	results := make([]int, len(inputs)) // 一次性分配
	for i, v := range inputs {
		results[i] = v * 2
	}
	return results
}

func ConcatStrings_Good(strs []string) string {
	var builder strings.Builder
	for _, s := range strs {
		builder.WriteString(s)
	}
	return builder.String()
}

func ObjectPool_Demo(n int) int {
	pool := sync.Pool{
		New: func() interface{} {
			buf := make([]byte, 1024)
			return &buf
		},
	}

	count := 0
	for i := 0; i < n; i++ {
		buf := pool.Get().(*[]byte)
		// 模拟处理
		(*buf)[0] = byte(i)
		count++
		pool.Put(buf)
	}
	return count
}

持续学习,持续构建。