編寫高性能的.NET代碼pdf

圖書網
圖書網
圖書網
10905
文章
1658
評論
2019年11月6日19:58:49 1 231
摘要

想讓自己的.NET代碼獲得zui佳的性能嗎?本書將揭開CLR的神秘面紗,不僅教你如何編寫性能優異的代碼,還能讓你“知其所以然”。作者參與設計并搭建的系統是世界上zui大型的高性能.NET系統之一,他在本書中融入了很多的經驗教訓。
本書不僅講解了CLR的工作機制,還詳細介紹了當前獲得zui佳性能的新方法,涉及.NET環境下的優化、對CLR功能的深入剖析、免費的工具和教程推薦、頗有價值的案例軼事、評測并提升性能的具體步驟。

編寫高性能的.NET代碼 作 者 :(美)沃森(Ben Watson)

編寫高性能的.NET代碼 出版社 : 人民郵電出版社

編寫高性能的.NET代碼 內容簡介

本書詳細介紹了如何編寫高性能的.NET程序,在zui大化托管代碼性能的同時,還能保證.NET的特性優勢。

本書循序漸進地深入.NET的各個部分,特別是底層的公共語言運行時(Common Language Runtime,CLR),了解CLR是如何完成內存管理、代碼編譯、并發處理等工作的。本書還詳細介紹了.NET的架構,探討了編程方式如何影響程序的整體性能,在全書中,還分享了發生在微軟的一些趣聞軼事。本書的內容偏重于服務器程序,但幾乎所有內容也同樣適用于桌面端和移動端應用程序。

本書條理清楚,言簡意賅,適合有一定.NET基礎的讀者和想要提高代碼性能的C#程序員學習參考。

編寫高性能的.NET代碼 目錄

前言

致謝

第1章 性能評估及工具

1.1 選擇評估內容

1.2 平均值還是百分位值

1.3 評估工具

1.4 小結

第2章 垃圾回收

2.1 基本運作方式

2.2 配置參數

2.3 減少內存分配量

2.4 首要規則

2.5 縮短對象的生存期

2.6 減少對象樹的深度

2.7 減少對象間的引用

2.8 避免對象固定

2.9 避免使用終結方法

2.10 避免分配大對象

2.11 避免緩沖區復制

2.12 對長期存活對象和大型對象進行池化

2.13 減少LOH的碎片整理

2.14 某些場合可以強制執行完全回收

2.15 必要時對LOH進行碎片整理

2.16 在垃圾回收之前獲得通知

2.17 用弱引用作為緩存

2.18 評估和研究垃圾回收性能

2.19 小結

第3章 JIT編譯

3.1 JIT編譯的好處

3.2 JIT編譯的開銷

3.3 JIT編譯器優化

3.4 減少JIT編譯時間和程序啟動時間

3.5 利用Profile優化JIT編譯

3.6 使用NGEN的時機

3.7 JIT無法勝任的場合

3.8 評估

3.9 小結

第4章 異步編程

4.1 使用Task

4.2 并行循環

4.3 避免阻塞

4.4 在非阻塞式I/O中使用Task

4.5 async和await

4.6 編程結構上的注意事項

4.7 正確使用Timer對象

4.8 合理設置線程池的初始大小

4.9 不要中止線程

4.10 不要改變線程的優先級

4.11 線程同步和鎖

4.12 評估

4.13 小結

第5章 編碼和類設計的一般規則

5.1 類和“結構”的對比

5.2 重寫“結構”的Equals和GetHashCode方法

5.3 虛方法和密封類

5.4 接口的分發(Dispatch)

5.5 避免裝箱

5.6 for和foreach的對比

5.7 強制類型轉換

5.8 P/Invoke

5.9 委托

5.10 異常

5.11 dynamic

5.12 自行生成代碼

5.13 預處理

5.14 評估

5.15 小結

第6章 使用.NET Framework

6.1 全面了解所用API

6.2 多個API殊途同歸

6.3 集合類

6.4 字符串

6.5 應避免使用正常情況下也會拋出“異常”的API

6.6 避免使用會在LOH分配內存的API

6.7 使用延遲初始化

6.8 枚舉的驚人開銷

6.9 對時間的跟蹤記錄

6.10 正則表達式

6.11 LINQ

6.12 讀取文件

6.13 優化HTTP參數及網絡通信

6.14 反射

6.15 評估

6.16 性能計數器

6.17 小結

第7章 性能計數器

7.1 使用已有的計數器

7.2 創建自定義計數器

7.3 小結

第8章 ETW事件

8.1 定義事件

8.2 在PerfView中使用自定義事件

8.3 創建自定義ETW事件Listener

8.4 獲取EventSource的詳細信息

8.5 自定義PerfView分析插件

8.6 小結

第9章 Windows Phone

9.1 評估工具

9.2 垃圾回收和內存

9.3 JIT

9.4 異步編程和內存模式

9.5 其他問題

9.6 小結

第10章 代碼安全性

10.1 充分理解底層的操作系統、API和硬件

10.2 把API調用限制在一定范圍的代碼內

10.3 把性能要求很高、難度很大的代碼集中起來并加以抽象

10.4 把非托管代碼和不安全代碼隔離出來

10.5 除非有證據證明,不然代碼清晰度比性能更重要

10.6 小結

第11章 建立追求性能的開發團隊

11.1 了解最影響性能的關鍵區域

11.2 有效的測試

11.3 性能測試平臺和自動化

11.4 只認數據

11.5 有效的代碼復查

11.6 訓練

11.7 小結

附錄A 盡快啟動對應用程序的性能討論

附錄B 大O表示法

附錄C 參考文獻

編寫高性能的.NET代碼 精彩文摘

1.1 選擇評估內容

在收集性能數據之前,你需要知道評估的內容是什么。聽上去這顯而易見,但實際上涉及面遠比想象的要廣泛得多。就拿內存來說,很顯然需要評估內存的占用情況,以便減少內存消耗。但要查看哪類內存呢?專用工作集內存(Private Working Set)、提交大小(Commit Size)、頁面緩沖池(Paged Pool)、峰值工作集(Peak Working set)、.NET堆內存大小,還是大對象堆內存(Large Object Heap,LOH)?為了保證負載的均衡,是否要查看各個處理器的堆內存?是否還需要關心其他類型的內存?為了跟蹤一段時間內的內存占用情況,是否需要知道每小時的平均值和峰值?內存的占用是否和系統負載相關?現在你明白了吧,光是針對內存,就能輕易地列出一大堆指標。而且目前我們還沒有涉及私有堆內存(Private Heap),也沒有對程序本身進行評估,還不知道都是哪些對象正在消耗內存呢。

請盡可能明確地描述評估內容。

故事

我曾經負責過一個大型的服務程序,當時我把進程專有內存的大小作為關鍵的性能指標,根據它來決定是否要在啟動內存需求很高的大型任務之前重啟進程。這導致了大量的“專有內存”被交換出去,對降低系統的內存負載毫無意義,而我們真正的目標就是要降低內存的負載。我們后來修改了評估系統,轉而評估工作集內存,這才產生了效果,把內存占用量減少了幾個GB(我說過這是一個大型應用)。

一旦確定了需要評估的內容,接下來就是選擇每個指標的目標值。在開發階段初期,這些目標值可能比較易變,甚至不可能知道。其實在初始階段不需要滿足這些目標值,但這能迫使你建立一套評價體系,依據這些值來自動評估你的工作。這些目標值應該是可量化的。我們對程序的較高要求也許就是要“快”,當然這沒錯。但這不算是一個很好的指標,因為“快”比較主觀,沒有什么明確的途徑來判斷是否達標。你必須能把目標定義成某個數字,而且是可測量的數字。

差的目標:用戶界面應該響應迅速。

好的目標:任何操作都不會阻塞UI線程超過20 ms。

但只是能被量化還不夠,還需要十分精確,正如前面的內存優化案例中所述。

差的目標:內存占用應該小于1 GB。

好的目標:當負載為每秒100個請求時,工作集內存的占用不能超過1 GB。

第二個版本的目標值給定了非常明確的前提條件,你可以明確知道是否滿足需求。實際上,這已給出了一個良好的測試用例。

目標值中的另一個決定因素是應用程序的類型。帶有用戶界面的程序必須不惜一切代價保證UI線程的響應能力,無論執行任何任務時都應如此。而服務器端程序每秒要處理幾十、幾百,甚至幾千個請求。它必須非常高效地完成I/O操作和數據同步,以保證吞吐量和CPU利用率的最大化。因此服務器端程序的設計完全不同于其他程序。如果某個應用程序的基礎架構先天不足,對效率問題考慮欠佳,那么再回頭去修正就很難了。

在設計系統和規劃性能評估方案時,有一條經驗也許很有用,那就是設想一下理論上的最佳性能。如果你能去掉其他所有開銷,比如垃圾回收、JIT、線程中斷,以及其他任何你能想到的開銷,然后還能剩下什么資源用來干活呢?對于負載、內存占用、CPU占用、內部同步等資源,你能想到的理論極限是多少?這通常依賴于程序所處的硬件和操作系統。比如,有1臺16個處理器、64GB內存的服務器,帶有2條10GB的網絡,你需要估計一下最大并行處理能力、內存中最多能存放多少數據,以及每秒的網絡吞吐量是多少。這能幫助你作出規劃,假如1臺服務器不夠用,那到底需要多少臺同檔次的機器。所有這些信息都是性能評估目標的絕佳來源。

圖書網:編寫高性能的.NET代碼pdf

繼續閱讀

說出你想要的,我們幫你找→→→社區

  • 我的微信
  • 掃一掃加好友
  • weinxin
  • 微信公眾號
  • 掃一掃關注
  • weinxin
C++覆轍錄pdf 程序設計

C++覆轍錄pdf

C++覆轍錄 作者:(美)STEPHEN C. DEWHURST C++覆轍錄 出版社:人民郵電出版社 C++覆轍錄 內容簡介 《C++覆轍錄》是C++大師Stephen C. Dewhurst根據多...
JRockit權威指南 深入理解JVMpdf 程序設計

JRockit權威指南 深入理解JVMpdf

作為曾經的三大主流Java虛擬機之一,JRockit展示了強大的伸縮性和高勁的性能,現在雖已被內置于Oracle融合中間件中,但JVM原理以及JMC工具等內容是相通的。 本書由JR...
iOS 11 開發指南pdf 程序設計

iOS 11 開發指南pdf

iOS 11 開發指南 作者:管蕾 iOS 11 開發指南 出版社:人民郵電出版社 iOS 11 開發指南 內容簡介 本書循序漸進地講解了iOS 11應用開發的知識。書中從搭建開發環境講起,依次講解了...
零起點Python足彩大數據與機器學習實盤分析pdf 程序設計

零起點Python足彩大數據與機器學習實盤分析pdf

適讀人群 : 足球愛好者、博彩愛好者,數據分析從業人員、數學、統計、計算機專業學生。 采用MBA個案模式,配合Python教學代碼,由淺入深,結合實盤案例,舉一反三。無須專業編程基...
匿名

發表評論

匿名網友 填寫信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

評論:1   其中:訪客  1   博主  0
    • 手指在跳舞 手指在跳舞 9

      最近在學習c# 非常感謝