谈到优化的问题,首先要明白C++的特性带来多大的性能开销、生成程序的瓶颈在哪个部分,然后采取针对性的措施。有时,在程序还没有得到优化、真正地满足需要之前,我们还不能松一口气,对自己说“Code Complete!”
分别简单地回顾一下:
1,C++对象模型
程序使用内存区、全局/静态存储区及常量数据区、堆和栈、C++中的对象
对象的生命周期、内存布局、构造与析构的调用
2,C++语言特性的性能分析
继承和虚函数:它们带来的开销,以及如何在必要的时候采取替代方案[1]
临时对象
内联函数
3,常用数据结构的性能分析
遍历、排序、查找、删除、插入:这些内容在稍微深入一点的C++书籍中,往往会有介绍。
动态数组的实现及分析:我想这部分除了明白原理以外,还需要在实际环境中进行实验了。
4,操作系统的内存管理
windows内存管理:虚拟内存、访问虚拟内存时的处理流程、地址映射、进程工作集[2]。
linux内存管理:同windows,当然,也需要测试。
5,动态内存管理
new、delete、内存泄露、智能指针
6,内存池[3]
原理示例、实现示例[4]。
7,动态链接库与动态库
windows DLL、linux DSO[5]
8,程序启动过程
windows、linux程序启动过程原理[6]
影响程序启动性能的因素:源代码、动态链接库、配置文件/资源文件因素
9,程序启动性能优化
10,内存分析工具IBM Rational Purify
11,性能分析工具IBM Rational Quantify
12,实时IO检测工具FileMon
[1] 回忆MFC框架的实现——用函数指针表代替虚函数。
[2] 在这方面,yathing使用得还比较少,不够深入,所以不清楚到底这类操作有多么耗时——需要实际测试。
[3] “池”的概念,不仅仅用在内存管理中,类似的还有数据库连接池、网络访问连接池等等。当创建、销毁一个object非常频繁的时候,我们就应该考虑通过“池”的“重利用”特性,减少开销了。
[4] 实现“池”机制,究竟能够多大地提高程序的性能呢?这不仅有趣,而且有实践指导意义。值得详细研究呢。
[5] DSO:Dynamic Shared Object
[6] 虽然我们不能修改操作系统的启动过程(MS可不会公开内核源代码呢~.~),这还真是令人沮丧。linux的内核也许会好一点?此外,我们将来可能遇到的还不止这些:J2EE中的容器执行效率、C++中间件的效率......只要存在“先加载后执行”,就会存在瓶颈的问题;广义一点说:只要构成应用程序的部件之间还是“有缝状态”,没有达到“天衣无缝、亲密无间”的情况,我们就会想到“瓶颈”的问题。