GC 优化实战
难度:⭐⭐⭐ 困难
考点
- 减少堆分配的具体手法
- strings.Builder vs += 拼接
- sync.Pool 对象复用
- 预分配 vs 动态增长
提示
- ProcessData:一次性 make([]int, len) 代替反复 append
- ConcatStrings:用 strings.Builder
- ObjectPool:sync.Pool + Get/Put 复用 buffer
- 用 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
}