win32程序啓動的過程和啓動速度的優化

我們在做大型客戶端軟件的時候,一個重要的指標就是程序的啓動速度,特別是冷啓動。

所謂冷啓動也就是指系統啓動以後,第一次打開程序。如果要減少程序的啓動速度,就要了解程序的啓動過程。

首先我們看看程序的大致的啓動過程:

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的詳細介紹。 

發佈了15 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章