本書詳細(xì)解釋了影響應(yīng)用程序性能的Windows、CLR和物理硬件的內(nèi)部結(jié)構(gòu),并為讀者提供了衡量代碼如何獨(dú)立于外部因素執(zhí)行操作的知識和工具。書中提供了大量的C#代碼示例和技巧,將幫助讀者zui大限度地提高算法和應(yīng)用程序的性能,提高個人競爭優(yōu)勢,使用更低的成本獲取更多的用戶。
本書共11章,D1章和D2章關(guān)注性能的度量指標(biāo)及性能評測;第3章和第4章則深入CLR內(nèi)部,專注于類型與CLR垃圾回收的內(nèi)部實(shí)現(xiàn);第5~8章及D11章討論.NET框架中的幾個特定的方面,以及CLR提供的幾種可用來進(jìn)行性能優(yōu)化的手段;第9章對復(fù)雜度理論和算法進(jìn)行了簡單的嘗試;D10章則包含了一些獨(dú)立話題,包括啟動時間優(yōu)化、異常及.NET反射等。
本書適合已經(jīng)擁有一定C#語言和.NET框架的編程基礎(chǔ),對相關(guān)概念較為熟悉的中g(shù)ao級程序員閱讀學(xué)習(xí)。
本書可以幫助你充分挖掘算法和應(yīng)用的潛力,避免常見陷阱,優(yōu)化程序性能,發(fā)揮競爭優(yōu)勢,降低運(yùn)行成本,提高用戶滿意度。
本書通過介紹大量的分析器和度量工具來指導(dǎo)讀者進(jìn)行性能度量,并講解了操作系統(tǒng)和CLR是如何以意想不到的方式來影響程序性能的,同時還通過可工作的示例和真實(shí)案例來演示性能改進(jìn)。
通過閱讀本書,讀者可以學(xué)到:
* 找到并定位瓶頸,以獲得zui大的性能效果;
* 使用垃圾回收器高效管理內(nèi)存;
* 更深入地理解底層操作系統(tǒng)及其性能特點(diǎn),從而更高效地編程;
* 通過并行化、緩存、微優(yōu)化和許多其他的技術(shù)來提升應(yīng)用程序的性能。
本書包含大量C#代碼示例和技巧,可以幫助讀者充分利用程序中每一處可能的性能提升,如降低內(nèi)存占用、一致化CPU使用,減少網(wǎng)絡(luò)和磁盤的I/O操作等。本書將會改變你對.NET程序開發(fā)的思考方式。
Sasha Goldshtein是微軟公司Visual C#方向的MVP,也是SELA Group的首席技術(shù)官(CTO)。Sasha領(lǐng)導(dǎo)了SELA技術(shù)中心的性能與排錯團(tuán)隊(duì),并且在多個領(lǐng)域提供咨詢服務(wù),包括生產(chǎn)環(huán)境調(diào)試、應(yīng)用程序性能排錯及分布式架構(gòu)。Sasha的經(jīng)驗(yàn)主要集中在C#與C 應(yīng)用程序開發(fā),以及高可伸縮性和高性能系統(tǒng)架構(gòu)等方面。他經(jīng)常在微軟公司的相關(guān)會議上發(fā)表演講,并舉辦了如.NET性能.NET調(diào)試深入Windows等多項(xiàng)培訓(xùn)課程。
Dima Zurbalev是SELA Group性能與調(diào)試團(tuán)隊(duì)緊急響應(yīng)組的高級咨詢師。Dima在性能優(yōu)化和排錯上幫助客戶完成了許多幾乎不可能完成的任務(wù),引導(dǎo)他們深入理解CLR及Windows的內(nèi)部細(xì)節(jié)。他的大部分開發(fā)經(jīng)驗(yàn)圍繞.NET與C 基礎(chǔ)項(xiàng)目進(jìn)行,同時,他也在為CodePlex上的多個項(xiàng)目貢獻(xiàn)代碼。
Ido Flatow是微軟公司Connected系統(tǒng)方向的MVP,也是SELA團(tuán)隊(duì)的高級架構(gòu)師。他擁有超過15年的行業(yè)經(jīng)驗(yàn),目前是SELA的Windows Azure及Web領(lǐng)域的專家之一,專長為WCF、ASP.NET、Silverlight及IIS等技術(shù)。他是一名微軟認(rèn)證培訓(xùn)師(Microsoft Certified Trainer,MCT),也是微軟官方WCF 4.0課程(10263A)的合作者。他同樣也經(jīng)常在微軟公司的相關(guān)會議上發(fā)表演講。
目 錄
第 1章 性能指標(biāo)1
1.1 性能目標(biāo)1
1.2 性能指標(biāo)3
1.3 小結(jié)4
第 2章 性能度量5
2.1 性能度量方式5
2.2 Windows內(nèi)置工具5
2.2.1 性能計(jì)數(shù)器6
2.2.2 Windows事件追蹤10
2.3 時間分析器20
2.3.1 Visual Studio采樣分析器20
2.3.2 Visual Studio檢測分析器24
2.3.3 時間分析器的gao級用法25
2.4 內(nèi)存分配分析器27
2.4.1 Visual Studio內(nèi)存分配
分析器27
2.4.2 CLR分析器29
2.5 內(nèi)存分析器34
2.5.1 ANTS Memory Profiler34
2.5.2 SciTech .NET Memory
Profiler36
2.6 其他分析器38
2.6.1 數(shù)據(jù)庫和數(shù)據(jù)訪問
分析工具38
2.6.2 并發(fā)分析工具38
2.6.3 I/O分析工具40
2.7 微基準(zhǔn)測試41
2.7.1 設(shè)計(jì)不佳的微基準(zhǔn)測試
示例41
2.7.2 微基準(zhǔn)測試指南44
2.8 小結(jié)45
第3章 類型揭秘47
3.1 示例47
3.2 引用類型和值類型在語義上的
區(qū)別48
3.3 存儲、分配和銷毀48
3.4 引用類型揭秘50
3.4.1 方法表51
3.4.2 調(diào)用引用類型實(shí)例的方法55
3.4.3 非虛方法的分發(fā)56
3.4.4 靜態(tài)方法和接口方法的
分發(fā)58
3.4.5 同步塊索引和lock
關(guān)鍵字59
3.5 值類型揭秘63
3.6 值類型的虛方法65
3.7 裝箱65
3.7.1 避免在調(diào)用值類型的Equals
方法時產(chǎn)生裝箱67
3.7.2 GetHashCode方法70
3.8 使用值類型的zui佳實(shí)踐72
3.9 小結(jié)72
第4章 垃圾回收73
4.1 為什么需要垃圾回收73
4.1.1 空閑列表管理73
4.1.2 引用計(jì)數(shù)垃圾回收74
4.2 追蹤垃圾回收75
4.2.1 標(biāo)記階段76
4.2.2 清理與壓縮階段80
4.2.3 固定82
4.3 垃圾回收器的特征83
4.3.1 垃圾回收時暫停線程83
4.3.2 在垃圾回收時掛起線程83
4.3.3 工作站垃圾回收85
4.3.4 服務(wù)器垃圾回收86
4.3.5 切換垃圾回收特征87
4.4 代89
4.4.1 代模型的假設(shè)89
4.4.2 .NET中代的實(shí)現(xiàn)90
4.4.3 大對象堆93
4.4.4 跨代引用94
4.4.5 后臺垃圾回收96
4.5 垃圾回收段和虛擬內(nèi)存97
4.6 終結(jié)化100
4.6.1 手動確定性終結(jié)化100
4.6.2 自動的非確定性終結(jié)化100
4.6.3 非確定性終結(jié)的缺點(diǎn)102
4.6.4 Dispose模式104
4.7 弱引用106
4.8 使用垃圾回收器108
4.8.1 System.GC類108
4.8.2 使用CLR宿主與垃圾
回收器進(jìn)行交互111
4.8.3 垃圾回收觸發(fā)器111
4.9 垃圾回收性能zui佳實(shí)踐112
4.9.1 代模型112
4.9.2 固定113
4.9.3 終結(jié)化114
4.9.4 其他建議與zui佳實(shí)踐114
4.10 小結(jié)117
第5章 集合和泛型119
5.1 泛型119
5.1.1 .NET泛型121
5.1.2 泛型約束122
5.1.3 CLR泛型的實(shí)現(xiàn)125
5.2 集合131
5.2.1 并發(fā)集合132
5.2.2 緩存133
5.3 自定義集合137
5.3.1 分離集(并查集)137
5.3.2 跳躍表138
5.3.3 一次性集合139
5.4 小結(jié)141
第6章 并發(fā)和并行142
6.1 挑戰(zhàn)與所得142
6.2 從線程到線程池,再到任務(wù)143
6.2.1 任務(wù)并行148
6.2.2 數(shù)據(jù)并行153
6.2.3 C# 5異步方法156
6.2.4 TPL中的gao級模式159
6.3 同步160
6.3.1 無鎖代碼161
6.3.2 Windows同步機(jī)制165
6.3.3 緩存167
6.4 通用的GPU計(jì)算168
6.4.1 C AMP簡介169
6.4.2 矩陣相乘171
6.4.3 多體仿真171
6.4.4 tile和共享內(nèi)存172
6.5 小結(jié)175
第7章 網(wǎng)絡(luò)、I/O和序列化176
7.1 I/O基本概念176
7.1.1 同步與異步I/O176
7.1.2 I/O完成端口177
7.1.3 .NET線程池181
7.1.4 內(nèi)存復(fù)制181
7.2 分散-聚集I/O182
7.3 文件I/O182
7.3.1 緩存提示183
7.3.2 非緩存I/O183
7.4 網(wǎng)絡(luò)I/O184
7.4.1 網(wǎng)絡(luò)協(xié)議184
7.4.2 網(wǎng)絡(luò)套接字185
7.5 數(shù)據(jù)序列化與反序列化186
7.5.1 序列化基準(zhǔn)測試187
7.5.2 數(shù)據(jù)集(DataSet)
序列化189
7.6 Windows通信基礎(chǔ)類庫189
7.6.1 限流189
7.6.2 處理模型190
7.6.3 緩存191
7.6.4 異步WCF客戶端與
服務(wù)器191
7.6.5 綁定192
7.7 小結(jié)193
第8章 不安全的代碼以及互操作194
8.1 不安全的代碼194
8.1.1 對象固定與垃圾回收
句柄195
8.1.2 生存期管理196
8.1.3 分配非托管內(nèi)存196
8.1.4 內(nèi)存池197
8.2 平臺調(diào)用198
8.2.1 PInvoke.net與P/Invoke
Interop Assistant軟件199
8.2.2 綁定200
8.2.3 列集器存根程序201
8.2.4 原生同構(gòu)類型204
8.2.5 列集方向、值類型和引用
類型的列集205
8.2.6 代碼訪問安全性206
8.3 COM互操作性206
8.3.1 生存期管理207
8.3.2 單元列集208
8.3.3 TLB導(dǎo)入與代碼訪問
安全性209
8.3.4 無主互操作程序集
(NoPIA)209
8.3.5 異常210
8.4 C /CLI語言擴(kuò)展211
8.4.1 marshal_as輔助庫213
8.4.2 IL代碼與原生代碼214
8.5 Windows 8 WinRT互操作214
8.6 互操作的zui佳實(shí)踐215
8.7 小結(jié)215
第9章 算法優(yōu)化216
9.1 復(fù)雜度的維度216
9.1.1 大O復(fù)雜度216
9.1.2 主定理217
9.1.3 圖靈機(jī)與復(fù)雜度分類218
9.1.4 停機(jī)問題219
9.1.5 NP完全問題221
9.1.6 記憶與動態(tài)規(guī)劃221
9.1.7 編輯距離222
9.1.8 每對頂點(diǎn)間的zui短路徑224
9.2 近似算法226
9.2.1 旅行商問題226
9.2.2 zui大割227
9.3 概率算法227
9.3.1 概率zui大割227
9.3.2 費(fèi)馬質(zhì)數(shù)測試228
9.4 索引與壓縮228
9.4.1 變量的長度編碼228
9.4.2 壓縮索引229
9.5 小結(jié)230
第 10章 性能模式232
10.1 JIT編譯器優(yōu)化232
10.1.1 標(biāo)準(zhǔn)的優(yōu)化方法232
10.1.2 方法內(nèi)聯(lián)233
10.1.3 消除邊界檢查234
10.1.4 尾調(diào)用236
10.1.5 啟動性能238
10.1.6 使用NGen進(jìn)行JIT預(yù)
編譯239
10.1.7 多核后臺JIT編譯241
10.2 關(guān)于啟動性能的其他技巧243
10.2.1 將強(qiáng)命名程序集置于
GAC中243
10.2.2 防止本機(jī)鏡像發(fā)生地址
重排243
10.2.3 減少程序集數(shù)目244
10.3 處理器相關(guān)的優(yōu)化245
10.3.1 單指令多數(shù)據(jù)流
(SIMD)245
10.3.2 指令級別并行247
10.4 異常250
10.5 反射250
10.6 代碼生成251
10.6.1 直接用源代碼生成
代碼251
10.6.2 用動態(tài)輕量級代碼生成技
術(shù)(LCG)生成代碼253
10.7 小結(jié)257
第 11章 Web應(yīng)用性能258
11.1 測試Web應(yīng)用的性能258
11.1.1 Visual Studio Web性能
測試和壓力測試259
11.1.2 HTTP監(jiān)控工具260
11.1.3 分析工具260
11.2 提高Web服務(wù)器的性能261
11.2.1 緩存公用對象261
11.2.2 使用異步頁面、模塊和
控制器262
11.2.3 創(chuàng)建異步頁面263
11.2.4 創(chuàng)建異步控制器265
11.3 ASP.NET環(huán)境調(diào)優(yōu)265
11.3.1 關(guān)閉ASP.NET跟蹤和調(diào)試266
11.3.2 關(guān)閉視圖狀態(tài)267
11.3.3 服務(wù)端輸出緩存268
11.3.4 對ASP.NET應(yīng)用程序進(jìn)行預(yù)編譯269
11.3.5 ASP.NET進(jìn)程模型調(diào)優(yōu)270
11.4 配置IIS271
11.4.1 輸出緩存271
11.4.2 應(yīng)用程序池配置273
11.5 網(wǎng)絡(luò)優(yōu)化274
11.5.1 使用HTTP緩存頭274
11.5.2 啟用IIS壓縮277
11.5.3 精簡與合并279
11.5.4 使用內(nèi)容發(fā)布網(wǎng)絡(luò) (CDN)280
11.6 對ASP.NET應(yīng)用程序進(jìn)行擴(kuò)容(scaling)281
11.6.1 向外擴(kuò)容281
11.6.2 ASP.NET擴(kuò)容機(jī)制282
11.6.3 向外擴(kuò)容的隱患282
11.7 小結(jié)283