Go语言性能优化
性能优化方向
切片
尽可能在使用
make()
初始化切片时提供容量信息使用
copy
代替re-slice
操作原因:在已经有的切片基础上创建切片,不会创建新的底层数组,当原切片较大,代码在原切片基础上新建小切片,导致原底层数组在内存中有引用,得不到释放,导致大内存未释放问题
map
预先分配内存
原因:不断向map中添加元素会触发map的扩容,提前分配好内存可以减少内存拷贝和Rehash的消耗。
字符串处理方式
使用strings.Builder处理字符串
原因:字符串在go语言是不可变类型,占用内存大小是固定的。使用
+
每次会重新分配内存。
空结构体
使用空结构体节省内存,空结构体实例不占据任何内存空间。可作为各种场景下的占位符。
atomic包
使用atomic包的性能要比加锁性能提高的多。
锁的实现是通过操作系统实现的,atomic是通过硬件实现的。