高质量编程与性能调优实战|青训营

90 阅读3分钟

高质量编程与性能调优实战

  1. 希望做到代码稳定、可读、易维护。
  2. 对性能进行测试,调优

一、高质量编程

  • 边界情况已考虑进去
  • 易读易维护
  • 稳定

1.1编码规范

在代码的格式、注释、命名规范,特别是异常和错误处理格外进行加强。需要有简单清晰的逻辑编写代码;确保代码可读->这样更易维护。

1.2代码格式

推荐使用gofmt自动化格式代码————>自动格式化Go语言。

goimports————>相当于gofmt+依赖包管理

1.3命名规范

简洁,缩略词看情况分大小写

  • function:函数不携带包名的上下文信息,函数名和包名成对出现。
  • package:小写字母组成,简短并包含一定的上下文信息,谨慎使用缩写,不与标准库同名。

1.4错误和异常处理

(1)简单错误

此处指的是仅出现一次的错误,在其他地方不需要捕获错误。那么我们优先使用errors.New来创建匿名变量。使用fmt.Errorf来进行格式化。

(2)错误的Wrap和Unwrap

错误的wrap实际上是提供了一个error嵌套另一个error能力,来生成一个error的追踪链。在fmt.Errorf中使用%w关键字来将一个错误关联到错误链中。

(3)错误判定

  • error.ls——>判断是否为一个特定错误。
  • errors.As——>在错误链上获取特定种类的错误。
  • panic:当程序发生不可逆转的错误时,可以在init或main函数中使用。
  • recover:只在当前的goroutine中使用,在嵌套中无法生效。

二、性能优化

2.1 Benchmark

Go语言提供了基准的性能测试————>Benchmark:go test -bench=. -benchmem image.png 图1 来源于‬⁢⁣⁡‬‬⁢‍‬⁡‌⁢⁡‬⁢‬‬‍​⁡‍⁢​​‬‌⁣⁡​​‍⁢⁣‬‬⁤‍⁡​‬​​⁢​​⁢高质量编程与性能调优实战 .pptx - 飞书云文档 (feishu.cn)

2.2性能优化建议

  1. slice(预分配内存):尽可能在使用make()初始化切片时提供容量信息。
  2. map(预分配内存):提前分配好空间可以减少内存拷贝和Rehash的消耗
  3. strings.Builder:使用+拼接性能最差,strings.Builder,bytes.Buffer,strings.Buffer更快
  4. bytes.Buffer:转化为字符串时重新申请了一块空间
  5. atomic包:通过硬件实现,效率比锁高。

2.3并发优化

  1. goroutine池
  2. 避免高并发调用系统同步接口: 网络IO可以基于epoll的异步机制(或kqueue等异步机制),但对于一些系统函数并没有提供异步机制。例如常见的posix api中,对文件的操作就是同步操作。虽有开源的fileepoll来模拟异步文件操作。但Go的Syscall还是依赖底层的操作系统的API。系统API没有异步,Go也做不了异步化处理。

———————————————— 2.3并发优化,版权声明:本文为CSDN博主「SmellCleaner」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/FXH1989/art…

三、参考文献

本篇参考于‬⁢⁣⁡‬‬⁢‍‬⁡‌⁢⁡‬⁢‬‬‍​⁡‍⁢​​‬‌⁣⁡​​‍⁢⁣‬‬⁤‍⁡​‬​​⁢​​⁢高质量编程与性能调优实战 .pptx - 飞书云文档 (feishu.cn)