本書(shū)詳細(xì)解釋了影響應(yīng)用程序性能的Windows、CLR和物理硬件的內(nèi)部結(jié)構(gòu),并為讀者提供了衡量代碼如何獨(dú)立于外部因素執(zhí)行操作的知識(shí)和工具。書(shū)中提供了大量的C#代碼示例和技巧,將幫助讀者zui大限度地提高算法和應(yīng)用程序的性能,提高個(gè)人競(jìng)爭(zhēng)優(yōu)勢(shì),使用更低的成本獲取更多的用戶(hù)。
本書(shū)共11章,D1章和D2章關(guān)注性能的度量指標(biāo)及性能評(píng)測(cè);第3章和第4章則深入CLR內(nèi)部,專(zhuān)注于類(lèi)型與CLR垃圾回收的內(nèi)部實(shí)現(xiàn);第5~8章及D11章討論.NET框架中的幾個(gè)特定的方面,以及CLR提供的幾種可用來(lái)進(jìn)行性能優(yōu)化的手段;第9章對(duì)復(fù)雜度理論和算法進(jìn)行了簡(jiǎn)單的嘗試;D10章則包含了一些獨(dú)立話(huà)題,包括啟動(dòng)時(shí)間優(yōu)化、異常及.NET反射等。
本書(shū)適合已經(jīng)擁有一定C#語(yǔ)言和.NET框架的編程基礎(chǔ),對(duì)相關(guān)概念較為熟悉的中g(shù)ao級(jí)程序員閱讀學(xué)習(xí)。
本書(shū)可以幫助你充分挖掘算法和應(yīng)用的潛力,避免常見(jiàn)陷阱,優(yōu)化程序性能,發(fā)揮競(jìng)爭(zhēng)優(yōu)勢(shì),降低運(yùn)行成本,提高用戶(hù)滿(mǎn)意度。
本書(shū)通過(guò)介紹大量的分析器和度量工具來(lái)指導(dǎo)讀者進(jìn)行性能度量,并講解了操作系統(tǒng)和CLR是如何以意想不到的方式來(lái)影響程序性能的,同時(shí)還通過(guò)可工作的示例和真實(shí)案例來(lái)演示性能改進(jìn)。
通過(guò)閱讀本書(shū),讀者可以學(xué)到:
* 找到并定位瓶頸,以獲得zui大的性能效果;
* 使用垃圾回收器高效管理內(nèi)存;
* 更深入地理解底層操作系統(tǒng)及其性能特點(diǎn),從而更高效地編程;
* 通過(guò)并行化、緩存、微優(yōu)化和許多其他的技術(shù)來(lái)提升應(yīng)用程序的性能。
本書(shū)包含大量C#代碼示例和技巧,可以幫助讀者充分利用程序中每一處可能的性能提升,如降低內(nèi)存占用、一致化CPU使用,減少網(wǎng)絡(luò)和磁盤(pán)的I/O操作等。本書(shū)將會(huì)改變你對(duì).NET程序開(kāi)發(fā)的思考方式。
Sasha Goldshtein是微軟公司Visual C#方向的MVP,也是SELA Group的首席技術(shù)官(CTO)。Sasha領(lǐng)導(dǎo)了SELA技術(shù)中心的性能與排錯(cuò)團(tuán)隊(duì),并且在多個(gè)領(lǐng)域提供咨詢(xún)服務(wù),包括生產(chǎn)環(huán)境調(diào)試、應(yīng)用程序性能排錯(cuò)及分布式架構(gòu)。Sasha的經(jīng)驗(yàn)主要集中在C#與C 應(yīng)用程序開(kāi)發(fā),以及高可伸縮性和高性能系統(tǒng)架構(gòu)等方面。他經(jīng)常在微軟公司的相關(guān)會(huì)議上發(fā)表演講,并舉辦了如.NET性能.NET調(diào)試深入Windows等多項(xiàng)培訓(xùn)課程。
Dima Zurbalev是SELA Group性能與調(diào)試團(tuán)隊(duì)緊急響應(yīng)組的高級(jí)咨詢(xún)師。Dima在性能優(yōu)化和排錯(cuò)上幫助客戶(hù)完成了許多幾乎不可能完成的任務(wù),引導(dǎo)他們深入理解CLR及Windows的內(nèi)部細(xì)節(jié)。他的大部分開(kāi)發(fā)經(jīng)驗(yàn)圍繞.NET與C 基礎(chǔ)項(xiàng)目進(jìn)行,同時(shí),他也在為CodePlex上的多個(gè)項(xiàng)目貢獻(xiàn)代碼。
Ido Flatow是微軟公司Connected系統(tǒng)方向的MVP,也是SELA團(tuán)隊(duì)的高級(jí)架構(gòu)師。他擁有超過(guò)15年的行業(yè)經(jīng)驗(yàn),目前是SELA的Windows Azure及Web領(lǐng)域的專(zhuān)家之一,專(zhuān)長(zhǎng)為WCF、ASP.NET、Silverlight及IIS等技術(shù)。他是一名微軟認(rèn)證培訓(xùn)師(Microsoft Certified Trainer,MCT),也是微軟官方WCF 4.0課程(10263A)的合作者。他同樣也經(jīng)常在微軟公司的相關(guān)會(huì)議上發(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 時(shí)間分析器20
2.3.1 Visual Studio采樣分析器20
2.3.2 Visual Studio檢測(cè)分析器24
2.3.3 時(shí)間分析器的gao級(jí)用法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ù)庫(kù)和數(shù)據(jù)訪問(wèn)
分析工具38
2.6.2 并發(fā)分析工具38
2.6.3 I/O分析工具40
2.7 微基準(zhǔn)測(cè)試41
2.7.1 設(shè)計(jì)不佳的微基準(zhǔn)測(cè)試
示例41
2.7.2 微基準(zhǔn)測(cè)試指南44
2.8 小結(jié)45
第3章 類(lèi)型揭秘47
3.1 示例47
3.2 引用類(lèi)型和值類(lèi)型在語(yǔ)義上的
區(qū)別48
3.3 存儲(chǔ)、分配和銷(xiāo)毀48
3.4 引用類(lèi)型揭秘50
3.4.1 方法表51
3.4.2 調(diào)用引用類(lèi)型實(shí)例的方法55
3.4.3 非虛方法的分發(fā)56
3.4.4 靜態(tài)方法和接口方法的
分發(fā)58
3.4.5 同步塊索引和lock
關(guān)鍵字59
3.5 值類(lèi)型揭秘63
3.6 值類(lèi)型的虛方法65
3.7 裝箱65
3.7.1 避免在調(diào)用值類(lèi)型的Equals
方法時(shí)產(chǎn)生裝箱67
3.7.2 GetHashCode方法70
3.8 使用值類(lèi)型的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 垃圾回收時(shí)暫停線程83
4.3.2 在垃圾回收時(shí)掛起線程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 大對(duì)象堆93
4.4.4 跨代引用94
4.4.5 后臺(tái)垃圾回收96
4.5 垃圾回收段和虛擬內(nèi)存97
4.6 終結(jié)化100
4.6.1 手動(dòng)確定性終結(jié)化100
4.6.2 自動(dòng)的非確定性終結(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類(lèi)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級(jí)模式159
6.3 同步160
6.3.1 無(wú)鎖代碼161
6.3.2 Windows同步機(jī)制165
6.3.3 緩存167
6.4 通用的GPU計(jì)算168
6.4.1 C AMP簡(jiǎn)介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)測(cè)試187
7.5.2 數(shù)據(jù)集(DataSet)
序列化189
7.6 Windows通信基礎(chǔ)類(lèi)庫(kù)189
7.6.1 限流189
7.6.2 處理模型190
7.6.3 緩存191
7.6.4 異步WCF客戶(hù)端與
服務(wù)器191
7.6.5 綁定192
7.7 小結(jié)193
第8章 不安全的代碼以及互操作194
8.1 不安全的代碼194
8.1.1 對(duì)象固定與垃圾回收
句柄195
8.1.2 生存期管理196
8.1.3 分配非托管內(nèi)存196
8.1.4 內(nèi)存池197
8.2 平臺(tái)調(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)類(lèi)型204
8.2.5 列集方向、值類(lèi)型和引用
類(lèi)型的列集205
8.2.6 代碼訪問(wèn)安全性206
8.3 COM互操作性206
8.3.1 生存期管理207
8.3.2 單元列集208
8.3.3 TLB導(dǎo)入與代碼訪問(wèn)
安全性209
8.3.4 無(wú)主互操作程序集
(NoPIA)209
8.3.5 異常210
8.4 C /CLI語(yǔ)言擴(kuò)展211
8.4.1 marshal_as輔助庫(kù)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ù)雜度分類(lèi)218
9.1.4 停機(jī)問(wèn)題219
9.1.5 NP完全問(wèn)題221
9.1.6 記憶與動(dòng)態(tài)規(guī)劃221
9.1.7 編輯距離222
9.1.8 每對(duì)頂點(diǎn)間的zui短路徑224
9.2 近似算法226
9.2.1 旅行商問(wèn)題226
9.2.2 zui大割227
9.3 概率算法227
9.3.1 概率zui大割227
9.3.2 費(fèi)馬質(zhì)數(shù)測(cè)試228
9.4 索引與壓縮228
9.4.1 變量的長(zhǎng)度編碼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 啟動(dòng)性能238
10.1.6 使用NGen進(jìn)行JIT預(yù)
編譯239
10.1.7 多核后臺(tái)JIT編譯241
10.2 關(guān)于啟動(dòng)性能的其他技巧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 指令級(jí)別并行247
10.4 異常250
10.5 反射250
10.6 代碼生成251
10.6.1 直接用源代碼生成
代碼251
10.6.2 用動(dòng)態(tài)輕量級(jí)代碼生成技
術(shù)(LCG)生成代碼253
10.7 小結(jié)257
第 11章 Web應(yīng)用性能258
11.1 測(cè)試Web應(yīng)用的性能258
11.1.1 Visual Studio Web性能
測(cè)試和壓力測(cè)試259
11.1.2 HTTP監(jiān)控工具260
11.1.3 分析工具260
11.2 提高Web服務(wù)器的性能261
11.2.1 緩存公用對(duì)象261
11.2.2 使用異步頁(yè)面、模塊和
控制器262
11.2.3 創(chuàng)建異步頁(yè)面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 對(duì)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 精簡(jiǎn)與合并279
11.5.4 使用內(nèi)容發(fā)布網(wǎng)絡(luò) (CDN)280
11.6 對(duì)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