性能优化思路
内存优化
分配连续内存
package main
// A ...
type A struct {
A1 int32
A2 int32
}
// B ...
type B struct {
B1 int
B2 int
}
func conv(sliceA []*A) []*B {
var (
tempSliceB = make([]B, len(sliceA))
sliceB = make([]*B, len(sliceA))
)
for i := 0; i < len(sliceA); i++ {
tempSliceB[i].B1 = int(sliceA[i].A1)
tempSliceB[i].B2 = int(sliceA[i].A2)
sliceB[i] = &tempSliceB[i]
}
return sliceB
}
func main() {
var sliceA = []*A{{A1: 0}, {A1: 1}, {A1: 2}}
conv(sliceA)
}内存对齐
结构体字段合理排序
按类型聚合,比如map中按key1、key2、key3、value1、value2、value3连续紧密排列,减少不必要的填充
通过显式填充避免 false sharing:
合理地减少对象数:
小对象结构体合并
有策略地进行字符串拼接
提前进行边界检查
避免频繁创建临时对象
使用sync.Pool缓存
减少长调用栈
预估容量,减少扩容次数
bytes.Buffer
slice、map预分配
减少不必要的memory copy
对象逃逸分析
并发优化
高并发的任务处理使用goroutine池
避免高并发调用同步系统接口
高并发时减少或避免共享对象互斥粒度
内联优化
使用位运算代替分支跳转
reference
最后更新于