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

69 阅读3分钟

高质量代码:编写的代码能够达到正确可靠、简洁清晰的目标。 编程原则:简单性、可读性、生产力。 编码规范 代码格式:推荐使用 gofmt 自动格式化代码。 gofmt 用法:go fmt 是 Go 语言官方提供的工具,用于自动格式化代码,确保代码风格的一致性。 注释:解释代码作用、如何做、实现的原因、出错情况。 命名规范:简洁胜于冗长,变量命名应清晰表达意图。 控制流程:避免嵌套,保持正常流程清晰。 goimports 用法:goimports 工具可以自动增删依赖包的引用,并将依赖包按字母顺序排序。

性能分析工具 pprof-排查实战 Heap-堆内存:使用 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"。

Block-阻塞:分析程序中的阻塞点。查看导致阻塞的 goroutine。 Goroutine-协程 & ThreadCreate-线程创建:记录协程和线程的创建信息。

性能优化建议 Benchmark:使用 go test -bench=. -benchmem 进行基准测试。 Benchmark 用法:go test -bench=. -benchmem 进行基准测试,衡量性能表现。 结果说明:通过测试函数名和参数 -8 来指定测试的迭代次数,例如 BenchmarkFib10-8 表示执行 Fib(10) 函数 8 次。

Map 预分配内存:减少内存拷贝和 Rehash 的消耗。 分析:不断向 map 中添加元素的操作会触发 map 的扩容。 建议:根据实际需求提前预估好需要的空间,减少内存拷贝和 Rehash 的消耗。

Slice 预分配内存:在 make() 初始化切片时提供容量信息。 字符串处理:使用 strings.Builder 优化字符串拼接。 字符串处理 strings.Builder:用法:优化字符串拼接,减少内存分配。 示例:func StrBuilder(n int, str string) string { var builder strings.Builder; for i := 0; i < n; i++ { builder.WriteString(str) } return builder.String() }

编码规范-控制流程 避免嵌套:保持正常代码路径为最小缩进。

错误处理:合理使用 panic 和 recover。 编码规范-错误和异常处理 errors.New:用于创建匿名变量表示简单错误。 fmt.Errorf:用于格式化错误信息 错误处理:使用 errors.Is 判断错误类型,使用 fmt.Errorf 格式化错误信息。 Panic:用于处理真正异常的情况,不建议在业务代码中使用仅在不可逆转的错误时使用。 Recover:只能在 defer 的函数中使用,用于捕获异常。

性能优化实践 pprof-排查实战 Heap 分析:通过 pprof 工具分析堆内存使用情况。找出内存分配的热点。 Block 分析:通过 pprof 工具分析程序中的阻塞点,优化性能瓶颈。 pprof-采样过程和原理 Goroutine:记录所有用户发起且在运行中的 goroutine。 ThreadCreate:记录程序创建的所有系统线程信息。

实践项目 pprof 实践项目 GitHub 项目:go-pprof-practice。 前置准备:下载项目代码,确保占用 1CPU 核心和超过 1GB 的内存。 性能优化建议 Benchmark 使用 基准测试:通过 go test -bench=. -benchmem 进行性能测试。 Slice 预分配内存 避免大内存未释放:在已有切片基础上创建切片,避免创建新的底层数组。 Map 预分配内存 减少扩容:提前分配好空间,减少内存拷贝和 Rehash 的消耗。 字符串处理 使用 strings.Builder:优化字符串拼接,减少内存分配。

实践案例 pprof 实践案例 Heap 分析:通过 pprof 工具分析堆内存使用情况。 Block 分析:通过 pprof 工具分析程序中的阻塞点。

总结

编码规范总结 代码是最好的注释:注释应提供代码未表达出的上下文信息。

性能优化总结 实际数据衡量:性能表现需要实际数据衡量,Go 语言提供了基准性能测试的 benchmark 工具。 这些笔记涵盖了您提供的图片中的主要内容,并进行了适当的拓展和整理。希望这些笔记对您的学习和工作有所帮助。