青训营学习记录day4 | 青训营笔记

48 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第4天,开始的开始除了准备学习相关的知识,还要规划好每天的日程。

今天的收获主要是代码的性能调优,通过之前的课程,我们已经对Go语言有了些基础,同时也实际编写了应用程序。昨天的学习我收获了如何写出更高质量的代码,然而高质量的代码能够完成功能,但是在大规模程序部署的场景,仅仅支持正常功能还不够,我们还要尽可能的提升性能,节省资源成本。

高性能代码为了效率会用到许多技巧,很多基础性能问题和语言本身相关,对应的调整对可读性和可维护性影响不大。性能调优的出发点是,在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的性能。

然而,有时候时间效率和空间效率可能对立,此时应当分析哪个更重要,作出适当的折衷。例如多花费一些内存来提高性能。

为了评估性能,可以使用go语言自带的性能评估工具benchmark。

然后是性能调优的一些建议。

slice是go中最常用的结构,在使用过程中要注意两点,一是是预分配,尽可能在使用make()初始化切片时提供容量信息,特别是在追加切片时;二是当原切片由大量的元素构成,但是我们在原切片的基础上切片时,可使用 copy替代 re-slice,因为虽然只使用了很小一段,但底层数组在内存中仍然占据了大量空间,得不到释放。 同理map和string也是。对于字符串操作,建议使用stringbuilder和bytebuffer。

性能优化有时是时间和空间的平衡,前面提到的都是提高时间效率的点,对于空间上空结构体是节省内存空间的一个手段,如实际应用中的set,可以用空结构体map时只保存键。