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