高性能 Go 语言发行版优化与落地实践的学习笔记

66 阅读3分钟

首先需要明白几个问题。 1、性能优化是什么?它是提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力 2、其次要明白要为什么要做性能优化?其一用户体验:带来用户体验的提升﹣让刷抖音更丝滑,让双十一购物不再卡顿,还有资源高效利用:降低成本,提高效率﹣很小的优化乘以海量机器会是显著的性能提升和成本节约。 性能优化的层面包括:业务代码、SDK、基础库、语言运行时、OS。详细分析:业务层优化、针对特定场景,具体问题,具体分析、容易获得较大性能收益、语言运行时优化、解决更通用的性能问题、考虑更多场景、Tradeoffs、数据驱动。 性能优化与软件质量 软件质量至关重要 在保证接口稳定的前提下改进具体实现。 测试用例:覆盖尽可能多的场景,方便回归 文档:做了什么,没做什么,能达到怎样的效果。 隔离:通过选项控制是否开启优化 可观测:必要的日志输出 主要内容有1、自动内存管理2、Go内存管理及优化3、编译器和静态分析4、go编译器优化 自动内存管理: 动态内存 程序在运行时根据需求动态分配的内存:malloc() 自动内存管理(垃圾回收):由程序语言的运行时系统回收动态内存 避免手动内存管理,专注于实现业务逻辑 保证内存使用的正确性和安全性: double-free problem, use-after-free problem .三个任务 为新对象分配空间 找到存活对象 回收死亡对象的内存空间 go内存管理及其优化 : 目标:为对象在 heap 上分配内存 提前将所存分块 调用系统调用mmap() 向 OS 申请一大块内存,例如 4 MB ·先将内存划分成大块,例如8KB,称作 mspan 。 再将大块继续划分成特定大小的小块,用于对象分配.noscan mspan: 分配不包含指针的对象 --GC 不需要扫描。 scan mspan: 分配包含指针的对象﹣- GC 需要扫描 对象分配:根据对象的大小,选择最合适的块返回 编译器和静态分析: 重要的系统软件 识别符合语法和非法的程序·生成正确且高效的代码 分析部分(前端 front end 词法分析,生成词素 (lexeme) 语法分析,生成语法树 语义分析,收集类型信息,进行语义检查 中间代码生成,生成 intermediate representation (IR) 综合部分 (后端 back end) 代码优化,机器无关优化,生成优化后的IR 代码生成,生成目标代码 go编译器优化: 为什么做编译器优化 . 用户无感知,重新编译即可获得性能收益 通用性优化 · 现状 。 采用的优化少 · 编译时间较短,没有进行较复杂的代码分析和优化 . 编译优化的思路 . 场景: 面向后端长期执行任务 · Tradeoff: 用编译时间换取更高效的机器码 · Beast mode 。函数内联 . 逃逸分析 . 默认栈大小调整 .边界检查消除 . 循环展开