像dotTrace這樣的profiler怎麼實現的?

如何自己得到C#方法的運行時間,要自己實現,像dotTrace那樣,怎麼實現呢


dotTrace的代碼profiling有兩種模式, sampling和tracing。兩種模式分別通過不同的機制來實現。

雖然沒試過去窺探dotTrace的實際實現,但它的核心功能應該都是基於CLR提供的Profiling API來實現的。

Sampling模式下,dotTrace會每隔5ms-11ms抓取一次當前應用的所有應用線程的調用棧(call stack),看看棧上都有哪些方法是活躍的,然後把這些信息根據時間間隔轉化為顯式給用戶看的熱度(耗時比例)信息。

這種模式開銷較小,即便在生產環境中長期打開也沒問題,但是它無法捕獲非常小的方法——這些方法的一次調用的用時可能比sample窗口還短,經常會「抓不到」。

Tracing模式下,dotTrace應該是通過改寫用戶方法的MSIL,在方法入口和出口處插入統計時間的代碼來實現的。這種做法也叫做instrumentation。

關於CLR所提供的Profiling API,請參考MSDN上的文檔:

https://msdn.microsoft.com/en-us/library/bb384493(v=vs.110).aspx &<- 其中對sampling和non-sampling模式的功能都有描述

David大牛的以前博客:David Bromans CLR Profiling API Blog

以及Github上公開的CoreCLR的ReJit範例,這就是一個tracing / instrumentation profiler的樣板:

clr-samples/ProfilingAPI at master · Microsoft/clr-samples · GitHub

===================================

不說dotTrace,在.NET上做profiler還有ETW神器。CLR的架構師之一Vance Morrison大神在這方面寫過很多東西,值得深入參考。

Vance大大的blog:Vance Morrisons Weblog

他寫的基於ETW的PerfView工具已經開源:GitHub - Microsoft/perfview: PerfView is a performance-analysis tool that helps isolate CPU- and memory-related performance issues.

Channel 9上的PerfView教程系列:PerfView Tutorial


簡單的用stopwatch來分析某個調用的耗時。

如果要專門做個軟體工具的話,用ETW事件進行分析比較好Intel Vtune軟體就是這樣做的。

使用 ETW 對 .NET 應用程序進行性能診斷


推薦閱讀:

7 個使用 bcc/BPF 的性能分析神器
淺談基於數據分析的網路態勢感知
【求知探新】獨立遊戲《Abi》場景耗時分析
《Linux Perf Master》Edition 0.2
遺傳演算法框架GAFT優化小記

TAG:C# | CLR | 性能分析 |