編寫高性能的 .NET代碼 (Writing High-Performance.NET Code)

沃森 (Ben Watson)

立即出貨 (庫存 < 4)

買這商品的人也買了...

相關主題

商品描述

本書詳細介紹瞭如何編寫高性能的.NET程序,在zui大化托管代碼性能的同時,還能保證.NET的特性優勢。
本書循序漸進地深入.NET的各個部分,特別是底層的公共語言運行時(Common Language Runtime,CLR),瞭解CLR是如何完成內存管理、代碼編譯、並發處理等工作的。本書還詳細介紹了.NET的架構,探討了編程方式如何影響程序的整體性能,在全書中,還分享了發生在微軟的一些趣聞軼事。本書的內容偏重於服務器程序,但幾乎所有內容也同樣適用於桌面端和移動端應用程序。
本書條理清楚,言簡意賅,適合有一定.NET基礎的讀者和想要提高代碼性能的C#程序員學習參考。

作者簡介

作者簡介
Ben Watson從2008年開始就已經是微軟的軟件工程師了。他在必應(Bing)平台的研發團隊工作時,建立了一套世界一流、基於.NET的高性能服務應用,足以應付幾千台電腦發起的大容量、低延遲請求,用戶數量高達幾百萬。他在業餘時間喜歡參加地理尋寶遊戲、閱讀各種書籍、欣賞古典音樂,享受與妻子Leticia、女兒Emma的歡聚時刻。他還是《C# 4.0 How-To》一書的作者,該書已由Sams出版。

譯者簡介
戴旭,1973年生,浙江蕭山人,西安建築科技大學計算機應用學士,杭州電子科技大學軟件工程碩士,高級項目管理師。

目錄大綱

第1章性能評估及工具1 
1.1選擇評估內容1 
1.2平均值還是百分位值3 
1.3評估工具4 
1.3.1 Visual Studio 5 
1.3.2性能計數器7 
1.3.3 ETW事件13 
1.3.4 PerfView 15 
1.3 .5 CLR Profiler 18 
1.3.6 Windbg 20 
1.3.7 .NETIL分析器24 
1.3.8 MeasureIt 25 
1.3.9代碼中的工具25 
1.3.10 SysInternals工具26 
1.3.11數據庫26 
1.3.12其他工具27 
1.3. 13評估本身的開銷27 
1.4小結27 

第2章垃圾回收28 
2.1基本運作方式30 
2.2配置參數33 
2.2.1工作站模式還是服務器模式33 
2.2.2後台垃圾回收34 
2.2.3低延遲模式(Low Latency Mode ) 35 
2.3減少內存分配量36 
2.4首要規則37 
2.5縮短對象的生存期37 
2.6減少對象樹的深度38 
2.7減少對象間的引用38 
2.8避免對象固定38 
2.9避免使用終結方法39 
2.10避免分配大對象40 
2.11避免緩衝區復制41 
2.12對長期存活對象和大型對象進行池化41 
2.13減少LOH的碎片整理45 
2.14某些場合可以強制執行完全回收46 
2.15必要時對 LOH進行碎片整理47 
2.16在垃圾回收之前獲得通知47 
2.17用弱引用作為緩存50 
2.18評估和研究垃圾回收性能51 
2.18.1性能計數器51 
2.18.2 ETW事件52 
2.18.3垃圾回收的耗時53 
2.18 .4內存分配的發生時機54 
2.18.5查看已在LOH中分配內存的對象55 
2.18.6查看內存堆中的全部對象57 
2.18.7為什麼對像沒有被回收60 
2.18.8哪些對像被固定著61 
2.18.9內存碎片的產生時機63 
2.18.10對象位於第幾代內存堆中67 
2.18.11第0代內存堆中存活著哪些對象68 
2.18.12誰在顯式調用GC.Collect方法70 
2.18. 13進程中存在哪些弱引用70 
2.19小結71 

第3章JIT編譯72 
3.1 JIT編譯的好處73 
3.2 JIT編譯的開銷73 
3.3 JIT編譯器優化75 
3.4減少JIT編譯時間和程序啟動時間76 
3.5利用Profile優化JIT編譯78 
3.6使用NGEN的時機78 
3.6.1 NGEN本機映像的優化79 
3.6.2本機代碼生成80 
3.7 JIT無法勝任的場合80 
3.8評估81 
3.8.1性能計數器81 
3.8.2 ETW事件82 
3. 8.3找出JIT耗時最長的方法和模塊82 
3.9小結83 

第4章異步編程84 
4.1使用Task 86 
4.2並行循環89 
4.3避免阻塞92 
4.4在非阻塞式I/O中使用Task 92 
4.4.1適應Task的異步編程模式94 
4.4.2使用高效I/O 96 
4.5 async和await 97 
4.6編程結構上的注意事項99 
4.7正確使用Timer對象100 
4.8合理設置線程池的初始大小101 
4.9不要中止線程102 
4.10不要改變線程的優先級102 
4.11線程同步和鎖103 
4.11.1真的需要操心性能嗎103 
4.11.2我真的需要用到同步鎖嗎104 
4.11.3多種同步機制的選擇105 
4.11.4內存模型106 
4.11.5必要時使用volatile 106 
4.11.6使用Interlocked方法108 
4.11.7使用Monitor(鎖) 110 
4.11.8該在什麼對像上加鎖112 
4.11.9異步鎖112 
4.11.10其他加鎖機制115 
4.11.11可並發訪問的集合類116 
4.11.12使用更大範圍的鎖116 
4.11.13替換整個集合117 
4.11.14將資源複製給每個線程118 
4.12評估118 
4.12.1性能計數器118 
4.12.2 ET W事件119 
4.12.3查找爭用情況最嚴重的鎖120 
4.12.4查找線程在I/O的阻塞位置120 
4.12.5利用Visual Studio可視化展示Task和線程121 
4.13小結122 

第5章編碼和類設計的一般規則123 
5.1類和“結構”的對比123 
5.2重寫“結構”的Equals和GetHashCode方法126 
5.3虛方法和密封類128 
5.4接口的分發(Dispatch) 128 
5.5避免裝箱129 
5.6 for和foreach的對比131 
5.7強制類型轉換133 
5.8 P/Invoke 134 
5.9委託136 
5.10異常137 
5.11 dynamic 138 
5.12自行生成代碼141 
5.13預處理146 
5.14評估146 
5.14.1 ETW事件146 
5.14.2查找裝箱指令147 
5.14.3第一時間發現“異常” 149 
5.15小結150 

第6章使用.NET Framework 151 
6.1全面了解所用API 151 
6.2多個API殊途同歸152 
6.3集合類152 
6.3.1泛型集合類153 
6.3.2可並發訪問的集合類154 
6.3.3其他集合類156 
6.3.4創建自定義集合類型156 
6.4字符串157 
6.4.1字符串比較157 
6.4.2 ToLower和ToUpper 158 
6.4.3字符串拼 接158 
6.4.4字符串格式化158 
6.4.5 ToString 159 
6.4.6避免字符串解析159 
6.5應避免使用正常情況下也會拋出“異常”的API 159 
6.6避免使用會在LOH分配內存的API 159 
6.7使用延遲初始化160 
6.8枚舉的驚人開銷161 
6.9對時間的跟踪記錄162 
6.10正則表達式164 
6.11 LINQ 164 
6.12讀取文件165 
6.13優化HTTP參數及網絡通訊166 
6.14反射167 
6.15評估168 
6.16性能計數器168 
6.17小結169 

第7章性能計數器170 
7.1使用已有的計數器170 
7.2創建自定義計數器171 
7.2.1 Averages 172 
7.2.2 Instantaneous 173 
7.2.3 Deltas 173 
7.2.4 Percentages 173 
7.3小結174 

第8章ETW事件175 
8.1定義事件175 
8.2在PerfView中使用自定義事件178 
8.3創建自定義ETW事件Listener 179 
8.4獲取EventSource的詳細信息184 
8.5自定義PerfView分析插件186 
8.6小結189 

第9章Windows Phone 190 
9.1評估工具190 
9.2垃圾回收和內存191 
9.3 JIT 191 
9.4異步編程和內存模式192 
9.5其他問題193 
9 .6小結193 

第10章代碼安全性194 
10.1充分理解底層的操作系統、API和硬件194 
10.2把API調用限制在一定範圍的代碼內194 
10.3把性能要求很高、難度很大的代碼集中起來並加以抽象199 
10.4把非託管代碼和不安全代碼隔離出來200 
10.5除非有證據證明,不然代碼清晰度比性能更重要200 
10.6小結200 

第11章建立追求性能的開發團隊201 
11.1了解最影響性能的關鍵區域201 
11.2有效的測試201 
11.3性能測試平台和自動化202 
11.4只認數據203 
11.5有效的代碼複查203 
11.6訓練204 
11.7小結205 
附錄A盡快啟動對應用程序的性能討論206 
定義指標206 
分析CPU佔用情況206 
分析內存佔用情況206 
分析JIT 207 
分析異步執行性能207 
附錄B大O表示法209 
常見算法及其複雜度211 
排序算法211 
圖論算法211 
查找算法212 
特殊案例212 
附錄C參考文獻213 
參考書籍213 
相關人士及博客213