C# RedGate分析器实际上是如何工作的

C# RedGate分析器实际上是如何工作的,c#,profiler,C#,Profiler,Ants profiler似乎在同一时间完成代码的插装和采样,我觉得这非常有趣 我使用了VS profiler,您必须运行两个不同的概要会话来识别瓶颈——ANTS如何在不修改和向编译函数中注入代码的情况下捕获IO绑定函数调用 编辑:ants使用仪器还是采样?ants profiler提供了几种不同的分析模式,其中一些使用采样,一些使用仪器(仪器模式仅在专业版中可用,采样模式是最近引入的)。提供了可用模式的简要说明,以及不同模式之间的比较 RedGate没有发布关于他们的分析器工作原理的技术细节,

Ants profiler似乎在同一时间完成代码的插装和采样,我觉得这非常有趣

我使用了VS profiler,您必须运行两个不同的概要会话来识别瓶颈——ANTS如何在不修改和向编译函数中注入代码的情况下捕获IO绑定函数调用


编辑:ants使用仪器还是采样?

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

RedGate没有发布关于他们的分析器工作原理的技术细节,但通过实验,我没有发现任何与其他分析器工作原理的显著差异(只是不同的用户界面,我确信在某些领域或边缘功能中存在其他分析器无法提供的优化)。根据您的问题,我猜您对其他探查器有些熟悉,但如果您对它在较低级别上的工作方式感兴趣,下面是一个简要概述:

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

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

long starttime = currentTime()
A
B
C
long endtime = currentTime() - starttime
这将告诉您运行该方法需要多少时间。当然,现代的探查器要做比这更为复杂的指令来优化性能、获得每行的性能、获取内存和IO信息以及定时信息等,但原理是一样的

现代操作系统还具有获得硬件级诊断的良好能力,因此探查器可以获得有关大多数系统的更详细信息,包括内存、磁盘IO、CPU利用率等。这些不同系统的工作方式与设备和驱动程序密切相关


请注意,这种注入可以在不同的阶段进行—在源代码级别、执行前的二进制级别、运行时等。特别是对于像C#这样的语言,在编译和程序集执行之间有一个中间阶段(CLR),在运行时注入这些附加指令更容易。它还允许您在运行时使用自定义指令围绕内部.NET framework中的方法(例如我想您正在询问的IO操作),这样即使您没有原始源代码,也可以获得性能信息。这同样依赖于它构建从指令集到方法名的映射的能力,但区别在于,您仍然可以注入额外的指令,而无需诉诸采样。我认为您可以采取一些特别的预防措施来增加难度,但是微软并没有真正的动机对.NET框架的内部进行这样的操作。

如果您所指的Ants Profiler是来自RedGate的,那么这是针对.NET运行时的。我怀疑他们正在使用微软提供的非常广泛的API来分析应用程序;我建议您首先查找ICorProfilerCallback/2/3和ICorProfilerInfo/2/3。API允许对方法入口/出口调用和其他功能进行检测和过滤回调


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

@Laepdjek链接的文档相当缺乏信息,但它表明采样模式意味着只对程序计数器进行采样。如果是这样的话,那就很不幸了,因为你所描述的样本就是这样的。正如原作者所指出的那样,它存在问题。他们没有指出的一个问题是毫无根据的假设。