RedGate Profiler如何实际工作

时间:2011-06-29 21:40:27

标签: c# profiler

似乎Ants剖析器在完全相同的时间进行了检测和代码采样,我觉得非常有趣

我使用过VS分析器,你必须运行两个不同的配置文件会话来识别瓶颈 - 如何在不修改代码并将代码注入编译函数的情况下捕获IO绑定函数调用?

编辑:蚂蚁是否使用仪器或采样?

2 个答案:

答案 0 :(得分:6)

Ants剖析器提供了几种不同的剖析模式,其中一些使用采样,其中一些使用仪器(仪器模式仅在专业版中可用,并且采样模式最近才引入)。可用模式的简要说明是here,以及不同模式之间的比较。

RedGate没有公布有关他们的探查器如何工作的技术细节,但是从实验中我没有发现与其他探查器的工作方式有任何显着差异(只是一个不同的用户界面,我确信在某些方面有优化)或其他分析器中没有的边缘特征)。根据你的问题,我猜你对其他个人资料有点熟悉,但如果你对它的工作方式感兴趣,可以在以下简要介绍:

在采样模式下,探查器将定期运行OS中断以暂停程序执行,并检查程序当前所处的方法。二进制或中间语言程序集中的每个方法都包含一个指令集。执行程序时,每个线程都将沿着该指令集前进,在调用方法时跳转到不同的指令集位置。线程执行的当前位置可以作为指向该指令集中位置的指针,您可以找到该地址是针对给定方法的指令集。因此,探查器会为方法名称构建指令集位置的映射,当它暂停程序时,它会检查当前执行的位置。通过将其映射到方法名称,它可以计算调用方法的次数以及运行的时间。但由于这只是一个示例,可能还有其他方法被调用,我们没有注意到,因为它们在我们在下一个时间间隔暂停程序之前返回。

在检测模式下,探查器会将额外的指令注入程序的指令集。假设您有一个在调用A->B->C方法时调用的指令集doSomething()非常粗糙的分析器可以注入额外的指令来执行类似

的操作
long starttime = currentTime()
A
B
C
long endtime = currentTime() - starttime

这将告诉您运行该方法需要多长时间。当然,现代剖析器做了比这更精细的指令,以优化性能,获得每行性能,获取内存和IO信息以及时序信息等,但原理是相同的。

现代操作系统也具有获得硬件级诊断的良好能力,因此分析器可以获得有关大多数系统的更详细信息,包括内存,磁盘IO,CPU利用率等。这些不同的系统如何工作特定于设备和驱动程序。

请注意,此注入可以在各个阶段完成 - 在源级别,在执行之前的二进制级别,在运行时等。特别是对于像C#这样的语言,编译和程序集执行之间存在中间阶段( CLR),在运行时更容易注入这些附加指令。它还允许您在运行时使用自定义指令包围内部.NET框架中的方法(例如我认为您要询问的IO操作),这样即使您没有原始源,也可以获得性能信息码。这再次依赖于它能够构建从指令集到方法名称的映射,但不同之处在于您仍然可以注入其他指令而无需采样。我认为你可以采取特殊的预防措施来使这一点变得更加困难,但微软没有真正的动机去做这个.NET框架的内部。

答案 1 :(得分:1)

如果你所指的Ants Profiler是RedGate的那个,那么这是针对.NET运行时的。我怀疑他们正在使用非常广泛的API来分析应用程序,由Microsoft提供;我建议你为初学者寻找ICorProfilerCallback / 2/3和ICorProfilerInfo / 2/3。 API允许对方法进入/退出调用和其他功能进行检测和过滤回调。

根据您的查询,我怀疑您感兴趣的一些开源(或可用代码)分析器是CLRProfiler4(Microsoft)和SlimTune。