宣傳語
暢銷書升級版
系統介紹性能最佳化的工作流程,方法論,C++性能特性,分析工具等,並配合大量最佳實踐及代碼實例。
總序
去國離家十六載後,2006年,當我再次歸來凝視上海這座不夜城時,不由地感慨世界真的變小了、變平了,中國作為地球村的一員,正以驚人的速度發展變化著。
世界正改變著中國,中國也不斷影響著世界。在備感欣喜振奮之餘,我亦常常思索,在一個越來越小、越來越平的世界裡,中國會面對怎樣的挑戰和機遇?IBM作為全球最大的信息技術和行業解決方案公司,又在哪些方面可以與中國分享我們的先進技術、經驗與創新為要的精神呢?
中國自2001年入世以後,很多企業開始迅速發展,創造出了許多新的發展模式。但是,中國、中國的企業在做大做強並開始走向世界的過程中也面臨著越來越多的挑戰。如何擁有更多更強的創新能力?如何提升中國在全球一體化經濟格局中的競爭力?如何增強企業的可持續發展能力並逐漸走向領袖地位?這應該是很多中國企業共同面對並思考的問題。
百年來,創新求變是IBM公司雖歷經艱難仍屢鑄輝煌的關鍵。因而,IBM公司雖多次轉型,卻始終以超前的技術、出色的管理和獨樹一幟的產品領導著全球信息技術的發展,保證了世界範圍內幾乎所有行業用戶對信息處理的全方位需求。關於創新,我們有很多的經驗願與中國業界分享。
中國開發中心(China Development Lab,簡稱CDL)是IBM在中國的視窗,是中國IT產業與世界交流的橋樑。CDL不僅把全球先進技術引入中國,也將中國領先的技術與行業解決方案推向世界。經過十年的蓬勃發展,CDL已經擁有5000名軟體開發人員,成為IBM全球規模最大的軟體開發基地之一,並成為跨國公司在中國最大的軟體開發機構。
我們始終恪守著“中國人才、國際管理;中國創造、服務全球”的理念,希望將IBM的最新技術、創新和管理心得與大家共同分享,並鼓勵CDL的專家走出實驗室。於是,我們有幸選擇了實力非凡、專業創新的電子工業出版社博文視點公司作為合作夥伴,推出這一系列叢書。該叢書的作者包括來自CDL WebSphere、Information Management、Lotus、Rational、Tivoli五大軟體產品開發團隊,以及來自中國開發中心新興技術學院(Emerging Technology Institute)、行業解決方案中心(Industry Solution Labs)、軟體服務團隊(Software Service)等各個部門的優秀架構師、資深工程師、管理者,範圍將涵蓋從開發理論及平台、方法論及實踐、項目管理、最新軟體技術與產品、先進行業解決方案架構,到最新技術標準和前沿技術發展趨勢甚至創新的商業模式探討等諸多方面。
我希望這套叢書能把我們一線專家寶貴的經驗、見解呈現給讀者。在與業界分享經驗和世界最新技術及趨勢的同時,我們希望能為推動中國IT產業的加速發展奉獻微薄之力。IBM中國開發中心將一如既往地同業界同仁一起,共鑄中國信息產業的輝煌明天!
王陽 博士
IBM全球副總裁兼中國開發中心總經理
前言
在計算機發展的早期階段,硬體資源相對而言是非常昂貴的。不論是CPU運行時間,還是記憶體容量,都給編程人員設定了很大的限制。因此,當時程式對運行性能和記憶體空間占用的要求是非常嚴格的。很多開發人員為了減少1%的CPU運行時間,為減少幾十個,甚至幾個位元組而孜孜努力。隨著計算機技術的快速發展,硬體資源變得相對便宜。因此有的觀點認為在開發軟體時,軟體的性能最佳化將不再重要,硬體將解決性能問題。但事實上,這種觀點是相對片面的。的確,硬體的發展解決了部分軟體的性能問題。但隨著硬體計算能力的提高,人們對軟體功能的要求也越來越高。當今的軟體功能越來越複雜,給用戶的界面和操作體驗也越來越智慧型和友好,這些需求帶來的軟體性能上的要求是硬體不能完全解決的。很多實際的項目證明,如果在開發軟體時不重視性能的最佳化,最終雖然實現了功能上的要求,但軟體的運行效率低下,也不能給用戶帶來很好的效益。因此,軟體的性能最佳化是計算機軟體開發過程中需要一直關注的重要因素。
程式性能最佳化的過程
從開發過程的角度來看,程式的性能最佳化流程一般如下圖所示。
性能最佳化的第1步是測量,尤其是規模較大,並且比較複雜的軟體系統,測量性能數據是進行性能最佳化的基礎。有了真實的數據,才可以進行第2步,即分析數據,從而找到系統真正的瓶頸所在。毫無疑問,最佳化應該是針對系統的性能瓶頸進行的,而找到性能瓶頸應該是建立在真實性能數據的基礎上的,而不能是主觀臆斷。很多工具可以輔助進行性能測量和數據分析,本書也會介紹一些這方面工具的使用方法和實踐經驗。
進行性能最佳化的核心在於第3步,即分析原因,修改程式,這也將是本書重點介紹的部分。程式的性能包括很多方面,常見的有程式的啟動速度、運行速度及運行時占用的記憶體等。而影響這些性能的因素也很多,大致可以分為如下兩類。
軟體編程設計因素:如算法和數據結構的選擇、程式語言的使用等。
軟體系統結構因素:如動態庫/靜態庫的組織、外部數據的存儲及網路環境等。
軟體編程設計因素可以看做是程式的內在本質,一般來說,也是對軟體性能影響較大的因素。只有對程式語言、算法和數據結構有深入的了解,才能分析出原因,並且找出解決性能問題的方法。本書將針對C++語言,深入介紹C++程式性能最佳化的方法和實例。
軟體系統的結構因素可以看做是程式的外在形式,它們一般和作業系統緊密相關。軟體系統,由於功能複雜,大都採用組件形式,以最大限度地提高可復用性。因此,一般會包含一些動態庫/靜態庫,這些庫的組織也會影響到軟體系統的性能。本書將針對Windows和Linux介紹動態庫和靜態庫的基本知識及其對軟體系統性能的影響。需要指出的是,上面這個最佳化的過程需要在軟體開發的整個過程中不斷地疊代進行。而且開始得越早,出現的性能問題越容易解決。
結構
本書主要針對C++程式的性能最佳化,由5篇組成。第1篇概述了應用程式性能最佳化工作的基本概念、總流程和方法論,是對性能最佳化的全局性介紹。
第2篇介紹C++語言的對象模型,與性能有關的語言特性及一些數據結構的性能,本篇是C++程式最佳化的基礎。
第3篇主要介紹C++程式記憶體使用的最佳化。記憶體無疑是影響程式性能的重要因素,很多程式由於沒有採用正確的方法分配和使用記憶體,不僅占用記憶體較多,而且運行效率不高。在本篇中將結合一些作業系統的記憶體管理機制介紹如何在特定的平台下進行記憶體最佳化。此外,還將深入介紹C++語言管理動態記憶體的機制和方法,並介紹一個常用的記憶體管理方法,即記憶體池的實現。
第4篇介紹程式啟動性能的最佳化。程式的啟動性能不僅受到軟體編程設計因素的影響,也會受到系統結構因素的影響,尤其是動態庫的影響。本篇將首先介紹動態庫的基本知識,然後介紹一些程式啟動性能最佳化的具體方法。
“工欲善其事,必先利其器”,好的工具會大大提高程式性能最佳化的效率。第5篇將介紹3類性能工具,即記憶體分析工具、性能分析工具和I/O檢測工具,它們是性能測量和分析的利器。
本書適用於有一定C++開發經驗的開發人員,也可以作為高等院校相關專業師生的參考書。
致謝
本書是集體創作的結晶,在此感謝大家出色的協作精神。本書的寫作也占用了大家大量的休息、娛樂,以及和家人在一起的時間,所以在此感謝作者們家人的理解和支持。同時,在成書的過程中與許多人的關懷、鼓勵和支持密不可分,其中包括CDL總裁Josephine,律師Andrew,Director Dennis,資深經理Debbi 和Cindy,研發經理閻小兵和扈曉煒等,在此表示感謝。最後,特別感謝出版社的有關領導、協調人員及編輯,沒有他們的支持和參與,本書的出版是不可能的。
由於時間倉促、水平有限,書中難免有許多不妥、甚至錯誤之處。在此敬請讀者不吝指出,我們將願意與讀者共同探討,並不勝感激。
目 錄
第1篇 應用程式性能最佳化概述
第1章 應用程式性能最佳化概述 2
1.1 應用程式性能的定義 2
1.2 性能基準 3
1.2.1 基準負載 3
1.2.2 基準用例 4
1.2.3 性能基準的運行 5
1.2.4 性能基準結果 6
1.3 性能分析方法概述 7
1.4 性能最佳化方法概述 9
1.5 本章小結 10
第2篇 C++程式最佳化基礎
第2章 C++對象模型 12
2.1 基本概念 12
2.1.1 程式使用記憶體區 12
2.1.2 全局/靜態存儲區及常量數據區 15
2.1.3 堆和棧 16
2.1.4 C++中的對象 18
2.2 對象的生命周期 18
2.3 C++對象的記憶體布局 23
2.3.1 簡單對象 23
2.3.2 單繼承 26
2.3.3 多繼承 29
2.4 構造與析構 38
2.5 本章小結 40
第3章 C++語言特性中的性能分析 41
3.1 構造函式與析構函式 42
3.2 繼承與虛擬函式 53
3.3 臨時對象 61
3.4 內聯函式 75
3.5 本章小結 83
第4章 常用數據結構的性能分析 84
4.1 常用數據結構性能分析 84
4.1.1 遍歷 89
4.1.2 插入 91
4.1.3 刪除 94
4.1.4 排序 96
4.1.5 查找 100
4.2 動態數組的實現及分析 102
4.2.1 動態數組簡介 102
4.2.2 動態數組實踐及分析 104
4.3 本章小結 110
第3篇 記憶體使用最佳化
第5章 作業系統的記憶體管理 112
5.1 Windows記憶體管理 112
5.1.1 使用虛擬記憶體 113
5.1.2 訪問虛擬記憶體時的處理流程 115
5.1.3 虛擬地址到物理地址的映射 117
5.1.4 虛擬記憶體空間使用狀態記錄 120
5.1.5 進程工作集 121
5.1.6 Win32記憶體相關API 123
5.2 Linux記憶體管理機制 132
5.2.1 進程的記憶體布局 133
5.2.2 物理記憶體管理 135
5.2.3 虛擬記憶體管理 136
5.2.4 虛擬地址映射為物理地址 137
5.3 本章小結 138
第6章 動態記憶體管理 139
6.1 operator new/delete 139
6.2 自定義全局operator new/delete 144
6.3 自定義類operator new/delete 148
6.4 避免記憶體泄漏 151
6.5 智慧型指針 156
6.6 本章小結 166
第7章 記憶體池 167
7.1 自定義記憶體池性能最佳化的原理 167
7.1.1 默認記憶體管理函式的不足 167
7.1.2 記憶體池的定義和分類 168
7.1.3 記憶體池工作原理示例 168
7.2 一個記憶體池的實現實例 170
7.2.1 內部構造 170
7.2.2 總體機制 171
7.2.3 細節剖析 174
7.2.4 使用方法 183
7.2.5 性能比較 184
7.3 本章小結 184
第4篇 應用程式啟動性能最佳化
第8章 動態連結與動態庫 186
8.1 連結技術的發展 186
8.1.1 編譯、連結和載入 187
8.1.2 靜態連結與靜態程式庫 189
8.1.3 動態連結與動態庫 195
8.2 Windows DLL,Dynamic Linked Library 196
8.2.1 DLL基礎 196
8.2.2 DLL如何工作 200
8.2.3 關於DLL的雜項 208
8.3 Linux DSO 209
8.3.1 DSO與ELF 209
8.3.2 DSO如何工作 217
8.3.3 構建與使用DSO 223
8.4 本章小結 233
第9章 程式啟動過程 234
9.1 Win32程式啟動過程 234
9.2 Linux程式啟動過程 238
9.3 影響程式啟動性能的因素 239
9.3.1 原始碼因素 240
9.3.2 動態程式庫因素 241
9.3.3 配置檔案/資源檔案因素 247
9.3.4 其他因素 248
9.4 本章小結 250
第10章 程式啟動性能最佳化 251
10.1 最佳化程式啟動性能的步驟 251
10.2 測試程式啟動性能的方法 252
10.3 最佳化執行檔和庫檔案 255
10.3.1 減少動態程式庫的數量 255
10.3.2 減小動態程式庫尺寸 257
10.3.3 最佳化執行檔和庫檔案中的代碼布局 257
10.4 最佳化原始碼 259
10.4.1 最佳化啟動時讀取的配置檔案及幫助檔案 259
10.4.2 預讀頻繁訪問的檔案 260
10.4.3 清除產生exception的代碼 261
10.4.4 PreLoad 262
10.4.5 延遲初始化 262
10.4.6 多執行緒化啟動 263
10.5 本章小結 264
第5篇 性能工具
第11章 記憶體分析工具
IBM Rational Purify 266
11.1 Rational Purify工作原理 266
11.2 使用Rational Purify來發現記憶體泄漏 269
11.2.1 記憶體泄漏及其對應用程式性能的影響 269
11.2.2 用PerfMon來發現Windows系統中有嚴重後果的記憶體泄漏 270
11.2.3 用Rational Purify來定位記憶體泄漏 273
11.2.4 典型的記憶體泄漏錯誤 274
11.3 Rational Purify使用指南 277
11.4 Rational Purify實例分析 283
11.5 本章小結 287
第12章 性能分析工具
IBM Rational Quantify 288
12.1 Rational Quantify工作原理 289
12.2 Rational Quantify使用指南 290
12.3 Rational Quantify實例分析 293
12.4 本章小結 297
第13章 實時IO監測工具FileMon 298
13.1 FileMon的工作原理 298
13.2 FileMon使用指南 301
13.3 使用FileMon解決問題 303
13.4 本章小結 306
參考文獻 307