像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優化小記