这是我参与「第五届青训营」伴学笔记创作活动的第五天
一、课程主要内容
性能优化及实战演例
二、课程主要内容
1.性能优化的建议
1.1 slice
- 尽可能做到在使用make初始化切片的时候就提供容量信息
原因:切片本质是一个数组片段的描述,其包括原始数组指针、片段的长度以及片段的容量(在不改变内存分配情况下的最大长度),如果我们在初始化切片的时候就提供容量信息,则程序会为该切片分配一个适合的存储空间,而如果我们未提供容量信息,在切片扩充的时候就需要不断地为其重新分配存储空间,增加程序的运行次数,从而降低运行效率。
- 在已有切片的基础上创建切片时,尽量使用copy而不是直接创建新的切片
1.2 map
和slice一样,map也是需要预分配内存的,所以在初始化map的时候也应该尽可能地做到提供容量信息。
1.3 字符串的处理
处理字符串有+、strings.Buider、bytes.Buffer、strings.Buffer四种方法,其中+处理速度最慢,strings.Buider和bytes.Buffer差不多,strings.Buffer最快。
原因:字符串在Go语言中属于不可变类型,占用内存大小是固定的,每次使用”+“都会重新为字符串分配内存,而strings.Builder,bytes.Buffer底层都是[]byte数组,采用的是内存扩容政策,不需要在每次拼接的时候都重新分配内存。bytes.Buffer在转换为字符串时会重新申请一块新的内存空间,而strings.Builder则是直接将[]byte数组以字符串的形式返回。
1.4 空结构体
空结构体struct{}在实例中不会占用任何空间,但是可以节省空间资源,起到占位符的作用,在map中应用可以起到set的功能,此时我们只需要用到map的键,不需要用到map的值。
1.5 atomic包的应用
在多线程程序中atomic包的性能会比锁更好,锁的实现是通过操作系统来完成的,属于系统调用,而atomic操作则是直接通过硬件来实现的,效率更高。