win32程序启动的过程和启动速度的优化

来源:互联网 发布:怎么用网络看电视直播 编辑:程序博客网 时间:2024/05/19 05:05

我们在做大型客户端软件的时候,一个重要的指标就是程序的启动速度,特别是冷启动。

所谓冷启动也就是指系统启动以后,第一次打开程序。如果要减少程序的启动速度,就要了解程序的启动过程。

首先我们看看程序的大致的启动过程:

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的详细介绍。 

0 0
原创粉丝点击