gpt4 book ai didi

c# - RedGate Profiler 是如何工作的

转载 作者:太空狗 更新时间:2023-10-30 00:44:57 26 4
gpt4 key购买 nike

Ants profiler 似乎在同一时间对代码进行检测和采样,我觉得这很有趣

我使用了 VS 分析器,你必须运行两个不同的分析 session 来识别瓶颈 - ANTS 如何在不修改代码并将代码注入(inject)编译函数的情况下捕获 IO 绑定(bind)函数调用?

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

最佳答案

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

RedGate 没有发布关于他们的分析器如何工作的技术细节,但从实验中我没有发现与其他分析器的工作方式有任何显着差异(只是一个不同的用户界面,我确信在某些领域有优化或其他分析器中不可用的边缘特征)。根据您的问题,我猜您对其他分析器有些熟悉,但如果您对它在较低级别上的工作方式感兴趣,这里有一个简短的概述:

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

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

long starttime = currentTime()
A
B
C
long endtime = currentTime() - starttime

这将告诉您运行该方法所花费的时间。当然,现代分析器会做比这更精细的指令来优化性能,获取每行的性能,获取内存和 IO 信息以及时序信息等,但原理是相同的。

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

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

关于c# - RedGate Profiler 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6527597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com