本篇是 Writing High-Performance .NET Code 的目錄索引,翻譯內容不定時更新,目錄也會同步修改。
- 性能測量及工具
- 選擇什么來衡量
- 平均數vs百分比
- 工具介紹
- Visual Studio
- 性能計數器
- ETW事件
- PerfView
- CLR Profiler
- Windbg
- Measurelt
- 內部測試代碼
- SysInternals 工具集
- 數據庫
- 其他工具
- 垃圾回收
- 基本操作
- 基本選項
- 減少分配率
- 最重要的規則
- 縮短對象的生命周期
- 降低對象的層次深度
- 減少對象之間的引用
- 避免釘住對象(Pinning)
- 避免使用終結器
- 避免大對象
- 避免復制緩沖區
- 將長生命周期對象和大對象池化
- 在某些情況下強制執行完整GC
- 減少大對象堆的碎片
- 按需壓縮大對象堆
- 在GC前受到消息通知
- 使用弱引用緩存對象
- 測量和調查GC性能
- 性能計數器
- ETW 事件
- 需要記錄多長時間的數據
- 對象分配在那里
- 那些對象唄分配在大對象堆
- 我的堆上有那些對象
- 為什么我的對象沒有被垃圾回收
- 那些對象被釘住了
- 內存碎片出現在那里?
- 那些對象生存在0代
- 有誰顯示調用了GC.Collect
- 我的進程里有那些弱引用
- JIT編譯
- JIT編譯的好處
- JIT編譯的花費
- JIT編譯的優化
- 減少JIT和啟動的時間
- 分析並優化JIT過程
- 什么時候使用NGEN
- 優化NGEN映像文件
- 新特性:本地化代碼生成
- 什么時候不能編譯JIT
- 測量
- 性能計數器
- ETW事件
- Subtopic
- 異步編程
- 使用Tasks
- Parallel Loops
- 避免阻塞
- Async and Await
- 關於一個程序結構的說明
- 正確使用計時器
- 確保配置了正確的線程池大小
- 不要終止線程
- 不要修改線程優先級
- 測量
- 通用編碼與類設計
- 類VS結構體
- 覆蓋結構體的Equals和GetHashCode方法
- 虛函數和終結類
- 接口調度
- 避免裝箱
- for vs. foreach
- 類型轉換
- P/Invoke
- 委托
- 異常
- 動態對象
- 代碼生成
- 預處理
- 測量
- 使用.NET框架
- 了解所有你所調用的API
- 一些API的思考
- 集合
- 字符串
- 避免API在正常情況下拋出異常
- 避免API在大對象堆里分配
- 使用延遲初始化
- 令人驚訝的Enum消耗
- 追蹤時間
- 正則表達式
- LINQ
- 讀取文件
- 優化HTTP設置於網絡通訊
- 反射
- 測量
- 性能計數器
- 性能計數器的消耗
- 創建一個自定義性能計數器
- ETW 事件
- 定義一個事件
- 自定義事件在PerfView里的開銷
- 創建一個自定義ETW事件監聽器
- 獲得事件源的詳細信息
- 自定義PerfView分析擴展
- Windows Phone
- 工具
- 垃圾回收與內存
- JIT
- 異步編程與內存模型
- 其它的思考
- 代碼安全
- 了解底層操作系統,api和硬件
- 在某些區域里限制你的api訪問
- 集中和抽象性能敏感和困難的代碼
- 隔離非托管或不安全代碼
- 保持代碼的清晰,知道有證明說有性能問題
- 構建一個具備性能意識的團隊
- 了解性能相關的領域
- 有效測試
- 性能基礎設施和自動化
- 只相信數字
- 有效的代碼回顧
- 教育
