我很好奇典型的C#性能分析器是如何工作的?
虚拟机中是否有特殊的钩子?
是否很容易扫描字节码以查找函数调用并注入调用以启动/停止计时器?
还是说这很困难,所以人们付费购买此类工具?
(顺便提一句,我发现这很有趣,因为它非常罕见——谷歌完全错过了搜索“C#性能分析器是如何工作的?”,结果全都是关于空调的......)
我很好奇典型的C#性能分析器是如何工作的?
虚拟机中是否有特殊的钩子?
是否很容易扫描字节码以查找函数调用并注入调用以启动/停止计时器?
还是说这很困难,所以人们付费购买此类工具?
(顺便提一句,我发现这很有趣,因为它非常罕见——谷歌完全错过了搜索“C#性能分析器是如何工作的?”,结果全都是关于空调的......)
1) 没有所谓的“典型”。人们通过多种方式收集配置文件信息:对PC进行时间抽样,检查堆栈跟踪,捕获方法/语句/编译指令的执行次数,插入探针以收集计数,并可选择调用上下文来获取调用上下文基础上的配置文件数据。每种技术可能会以不同的方式实现。
2) 有性能分析“C#”和性能分析“CLR”。在微软的世界中,你可以对CLR进行性能分析,并将CLR指令位置反向转换为C#代码。我不知道Mono是否使用相同的CLR指令集;如果他们没有,那么你就不能使用微软的CLR分析器;你必须使用Mono的IL分析器。或者,你可以对C#源代码进行仪表化处理以收集性能分析数据,然后在MS、Mono或某个C#兼容的自定义编译器上编译/运行/收集该数据,又或者是在嵌入式系统(如WinCE)中运行的C#,其中空间宝贵而CLR内置功能往往会被省略。
一种仪器化源代码的方法是使用源到源的转换,将代码从其初始状态映射到包含收集数据代码以及原始程序的代码。这篇关于如何使用程序转换系统插入测试覆盖探针的论文展示了当执行代码块时插入设置块特定布尔标志语句的方式。计数分析器用计数增量指令替换了这些探针。时间分析器为这些探针插入了时钟快照/增量计算。我们的C#分析器实现了C#源代码的计数和时间分析两种方式;它还通过使用收集执行路径的更复杂的探针来收集调用图数据。因此,它可以以这种方式在调用图上生成定时数据。这种方案适用于任何你能得到半可靠分辨率时间值的地方。这是一篇讨论仪器和采样方法的长文链接: