这是我参与「第五届青训营 」伴学笔记创作活动的第4天。
一、本堂课重点内容
主要学习了如何编写更简洁清晰的代码,了解了Go语言程序优化手段以及Go程序性能分析工具,了解了工程中性能优化的原则和流程。
二、详细知识点介绍
高质量编程
什么是高质量————代码正确可靠,简洁清晰,各种边界条件完备,异常处理正确,易读易维护……等等,都是高质量编程代码的特点。
编程原则
对于不同的编程语言和不同的应用场景,高质量编程遵循的原则是相通的,主要分为三点:简单性,可读性,生产力。
简单性:
消除“多余的复杂性”,以简单的逻辑编写代码。
不理解的代码无法修复改进。
可读性:
代码是给人看的,而不是机器。
编写可维护代码的第一步是确保代码可读。
生产力:
团队整体工作效率非常重要。
编码规范
代码格式
推荐使用gofmt自动格式化代码。gofmt是go语言官方提供的工具,能自动格式化go语言代码为官方统一格式,常见IDE都西池方便的配置。
注释
注释应该做的:
解释代码作用,适合于注释公共符号;
解释代码如何做的,适合于解释实现过程;
解释代码实现的原因,适合于解释代码的外部因素,提供额外的上下文;
解释代码在什么情况下会出错,适合于解释代码的限制条件。
命名规范
对于变量:
1.简洁胜于冗长;
2.缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写;
3.变量距离其被使用的地方越远,则需要携带越多的上下文信息,比如全局变量;
对于函数:
1.函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的;
2.函数名尽量简短;
3.当foo的包某个函数返回类型为foo时,可以省略类型信息额不导致歧义;
对于包:
1.只由小写字母组成,不包含大写字母和下划线等字符;
2.简短并包含一定的上下文信息;
3.不要与标准库同名;
4.不使用常用变量名作为包名;
5.使用单数而不是复数;
控制流程
尽量避免嵌套,保持正常流程清晰;
尽量保持正常代码路径为最小缩进;
错误和异常处理
简单错误:指的是仅出现一次的错误,优先使用errors.New来创建匿名变量直接表示简单错误。如果有格式化的要求,使用fmt.Errorf。
错误的Wrap和Unwrap:错误的wrap实际上提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链。在fmt.Errorf中使用:%w关键字来将一个错误关联到错误链中;
性能优化
性能表现需要实际数据衡量。
go语言提供了支持基准性能测试的benchmark工具。
slice预分配内存:尽可能使用make()初始化切片时提供容量信息。因为切片的本质是一个数组片段的描述。map预分配内存和slice差不多。
字符串处理:一般使用strings.Bulider。使用+拼接字符串性能最差,strings.Builder,strings.Buffer差不多。
空结构体:空结构体struct{}实例不占据任何的内存空间,但本身具有很强的语义,可以作为占位符使用。
atomic包:锁的实现是通过操作系统来实现,属于系统调用。而atomic造作是通过硬件实现,效率比较高。
三、实践练习例子
简介:对逻辑相对复杂的程序如何进行性能调优。主要分为三个方面:业务服务优化,基础库优化,go语言优化。
业务服务优化:
1.建立服务性能评估手段;
2.分析性能数据,定位性能瓶颈;
3.重点优化项改造;
4.优化效果验证。
基础库优化:
1.分析基础库核心逻辑和性能瓶颈;
2.内部压力测试验证;
3.推广业务服务落地验证。
go语言优化:
1.优化内存分配策略;
2.优化代码编译流程,生成更高效的程序;
3.推广业务服务落地验证。
四、课后个人总结
经过本堂课的学习,我学习了高质量编程的相关概念和性质,对性能调优的原则和方法有了一定的了解,并且学习了如何使用性能优化分析工具。