性能优化是软件开发过程当中必不可少,但又很困难的工做。这里是我长期对C/C++开发的性能优化的经验总结。
算法
性能优化必须遵循必要的原则进行。编程
优化前必须有个明确的目标。目标能够有近期的,中期的和远期的。缓存
而且目标必须是可达到,可量化的具体的值。性能优化
在任何优化前必须进行性能测试,获得的测试结果必须保存下来。这些数据有以下用处:网络
与以前的测试结果进行比较。若是没有任何数据,仅仅靠自我推断绝对是不可靠的。数据结构
对外公布。这是让同事/领导/客户相信性能的最直接的信息。多线程
学习。屡次优化获得的测试数据是学习和选择高效的优化方式的最好的参照物。架构
发现热点。若是没有这些测试数据,咱们没法明确的指导最大最长的耗时发生在哪里。这是优化的前提。并发
性能优化的任何方法和尝试,以及获得的测试数据都应该记录下来。数据结构和算法
性能测试在很大程度上实际就是压力负载测试。对于这类的性能不须要尽量的加大数据压力,测试对应的性能。
另外一个必需要进行屡次反复的相同测试,并执行相关的数理统计计算。有些产品和流程只有运行几百万次才能真正说明性能。这个是很是重要的。
性能优化不是改变功能。
因此这些都应该基于重构的原则进行,这就意味这任何性能优化不能对上层客户代码形成影响。若是这是没法避免的,必须明确说明。
发现了热点后,咱们必须将从最大的耗时着手。2/8原则有两层含义:
最为耗时最影响性能的热点仅占全部代码或者流程的很是小的比例;
仅对很小的一部分的代码执行优化,性能便可获得极大提高,甚至达到预订目标。
因此咱们不能盲目的优化,更不能以本身的推断或者所为的“理论上是这样的”想法执行优化,必须实事求是。
不少时候咱们执行优化时是在debug模式下执行的,可是最终咱们造成release模式下的性能数据。若是其中加入了为了记录性能的debug代码,那么在release模式下必须关闭。
不少场景下,可能是开发人员的性能测试指导性能优化。若是咱们将整个流程自动化,那么能够极大的提高优化效率,更快发布。另外自动化最大的好处是能够将该过程嵌入测试人员测试过程,或者自动化测试/集成/交付(CI/CD)。
可是这是很是困难的,因此须要视状况而定。
咱们的性能优化以及获得的结果必须是真实可信的,不能有半点做假和推测。
性能测试是咱们优化的第一步。良好的测试方法是好的开始,而不良甚至错误的测试方法会得出错误的结果。
优化的方法有不少,可是这不意味着全部的方法在每一个场景下都是可用的。
能够分为宏观和微观两个层次:宏观主要是基础设施以及工程设计的优化,这个层面是不会对实现作很大变更的;而微观则是对具体的编码调整,内部调整可能会很是大。
硬件升级:这是最直接,有时甚至是最高效的优化方法。
操做系统升级:新的操做系统版本拥有更好的性能表现,特别是在内核操做以及内存操做方面。
编程语言:使用其余更好的编程语言,或者更加符合性能表现的编程语言也是经常使用的性能优化方法。
编译器:不少语言拥有不一样的编译器,不一样的编译器获得可执行程序性能有时差异很到。而同一个编译器的不一样版本也有不一样的性能表现。
临时变量
成员变量
静态变量
函数参数和返回值
动态内存分配
内存池
内存拷贝
缓存
阻塞和同步
无锁队列
内存映射
共享内存
使用模板和范型替换继承
错误码替换异常
字符串
浮点
递归
搜索
排序
网络通讯
文件读写
用户态和内核态的切换
编译期计算
编译选项
内联-inline
新的语言版本性能更好;
新的语言版本提供了更好性能工具和特性的选择;
新的内存布局;
新的内存管理方式。
在不少时候优化可能得出彻底相反的结果,即性能反而更糟糕。这是很是正常的,优化路线可能很曲折漫长。有些热点须要长时间尝试不一样的方法才能有效优化。
因此耐心和信心是优化过程当中必备的良好心理素质。