Go语言学习5 | 青训营笔记1

85 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第五天

一、课程主要内容

性能优化及实战演例

二、课程主要内容

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操作则是直接通过硬件来实现的,效率更高。