第一章 应用程序性能优化概述
性能优化方法概述
1、针对I/O瓶颈的优化
每次I/O操作大约在10毫秒的量级,100次就需要1秒左右,所以要尽量避免不必要的I/O,具体做法有:
- 预先顺序读文件避免随机访问;
- 合并多个小文件为单个大文件;
- 优化动态库文件的加载;
- 交错IO时间和CPU时间等。
2、针对计算密集的优化
计算密集的性能问题主要有内存分配性能、字符串操作、共享变量的互斥锁保护等,具体优化方法包括:
- 去掉冗余代码;
- 字符串优化操作;
- 减少内存分配、释放操作,例如内存池;
- 减少不必要的互斥锁访问;
- 根据性能需求选择数据结构;
- 延迟工作,按需执行,例如文档中的图片在翻到那一页时再加载进内存;
- 减少跨进程的调用;
- 用高性能的函数库;
3、没有特点瓶颈,需要在设计层面进行优化。(设计模式)
4、感觉上的性能优化
- 有的设计虽然没有真正提升性能,但是让用户感觉快了,例如:
- 流式播放设计,用户不需要等到视频文件下载完再播放,而是可以一边下载一边播放;
- 线程化设计,有的操作需要较长时间去完成,可以把这些操作设计设计成非阻塞式的,用户可以再等待完成的时间去做其他事情。
应用程序的两大性能指标:相应时间和内存使用。
第二章 C++对象模型
一个程序占用的内存区一般分为如下五种:
- 全局/静态数据区。
- 常量数据区。
- 代码区。
- 栈。
- 堆。
栈中存储自动变量或者局部变量,以及传递的函数参数等,而堆是用户程序控制的存储区,存储动态产生的数据。
内存对齐:即堆上分配内存时按16个字节对齐,所以申请5个整数共20个字节,但占据32个字节的内存。再申请一个字节时,系统会从32个字节后开始分配。
内存对齐虽然会浪费一些内存,但由于CPU在对齐方式下运行比较快,所以一般对程序性能还是有好处的。C/C++程序中的struct\union和class的成员变量按多少字节对齐或者关闭对齐。