我们在做大型客户端软件的时候,一个重要的指标就是程序的启动速度,特别是冷启动。
所谓冷启动也就是指系统启动以后,第一次打开程序。如果要减少程序的启动速度,就要了解程序的启动过程。
首先我们看看程序的大致的启动过程:
a、操作系统首先创建程序的进程,并为进程分配自己的空间,操作系统加载器会把程序相应的代码和数据段映射到该空间中
b、操作系统加载器读取程序的导入符号表,根据符号表查找该程序依赖的动态库,并通过loadlibrary加载
(1)按顺序查找到动态库文件,加载器会为每个动态库确定一个合适的基地址,如果该基地址和动态库希望的基地址不同, 会对动态库rebase,然后把动态库映射到虚拟内存空间
(2)读取相应的符号表,比较程序的导入符号和动态库的到处符号是否匹配
(3)针对该动态库的导入符号表,再查找其依赖的动态库,重新跳到(1)
(4)调用动态库进行初始化,等所有的动态库加载完毕,该步骤完成
c、初始化程序的全局变量,全局对象自动调用构造函数
d、启动程序入口点函数(main)
以上就是程序的简单启动过程,通过以上的过程,我们可以看出,在程序影响启动速度方面大致有两个重要的因素
a、IO操作时间的消耗(一般磁盘io是以最小页4k为单位的),主要在动态库的加载,配置文件的读取
b、程序代码占用的cpu时间,启动代码的优化
程序启动的时候执行代码量较小,冷启动的时候一般IO时间占到大部分,热启动时,系统的缓存机制,IO消耗的时间大幅度减少,所以代码运行可能占到大部分
1、在动态库的加载过程中,尽量让程序启动放到同一个动态库,并且相应的函数按顺序到处,这样会减少缺页中断,减少磁盘IO,从而减少启动时间
2、动态库初始化尽量简单,导出函数尽量减少
3、程序的配置文件尽量不要分散到很多小文件中,资源文件也是一样
4、利用操作系统的预读缓存机制,预读文件记录在\\windows\prefetch下面
5、可以实现一个preload的服务,系统启动后自动加载必须的资源
6、多线程启动
增加一个测试方法:
ETW(Event Tracing for Windows)和XPERF。这是在Windows上,尤其是在Windows 7上做性能分析的最重要的工具。他就像一个系统的录像机,把一个时间段内系统中的主要事件——如每一次CPU调度、每一次Disk I/O、每一次Foreground Window的切换等——都记录下来,生成一个ETL文件。然后,用Xperf进行分析(就像做慢动作的回放),找到性能的问题。在http://msdn.microsoft.com/en-us/performance上有关于XPerf的详细介绍。