C#分析器作为库,而不是应用程序

C#分析器作为库,而不是应用程序,c#,profiling,C#,Profiling,有人知道C#中有一个分析器库,我可以将它嵌入到我的源代码中,用于基于样本的评测吗?也就是说,定期获取指令指针位置,将其存储在内存中,并允许将其保存到文件中,并在以后进行分析,可能是通过某些桌面应用程序 我知道有很多传统的剖析器应用程序(如JetBrains、Ants等),但我想剖析一个运行在非桌面平台上的C#程序,在那里这些剖析器都不能使用。我希望我的应用程序自己采样,而不是外部探查器。ETW跟踪基础设施提供了这一功能。尝试运行Microsoft提供的perfview工具。它使用ETW显示采样的

有人知道C#中有一个分析器库,我可以将它嵌入到我的源代码中,用于基于样本的评测吗?也就是说,定期获取指令指针位置,将其存储在内存中,并允许将其保存到文件中,并在以后进行分析,可能是通过某些桌面应用程序


我知道有很多传统的剖析器应用程序(如JetBrains、Ants等),但我想剖析一个运行在非桌面平台上的C#程序,在那里这些剖析器都不能使用。我希望我的应用程序自己采样,而不是外部探查器。

ETW跟踪基础设施提供了这一功能。尝试运行Microsoft提供的perfview工具。它使用ETW显示采样的堆栈轨迹

您可以自己使用ETW构建采样分析器。不过,这可能需要一点工作。

探查器可能适合。我知道,至少在早期版本中,评测被编译到了您的二进制文件中

《用户指南》似乎很好地概述了如何使用它:


我认为System.Diagnostics.Stopwatch还不够?@AntonioBakula我想要一个采样分析器,它不需要我为要分析的代码插入仪器。程序计数器是您可以采样的最不有用的东西。抓取调用堆栈的样本要好得多,对于堆栈上的每个调用,不仅仅是执行调用的函数,而是它从中调用的行。更重要的是,高采样频率不是必需的@MikeDunlavey您当然是对的,当我说捕获指令指针位置时,我的意思是获取当前堆栈跟踪。我不认为有什么办法可以从C#那里获得IP,因为有StackTrace类。@kaalus:祝你好运。更详细地说:我和其他人都有资金做性能调整的最佳方法是人工观察少量的实际原始(未汇总)样本。你看到了否则就会错过的机会。就我所见,ETW(Windows事件跟踪)是一个跟踪框架,提供循环日志文件的日志记录。那里没有任何形式的剖析。而且它在Windows之外也不工作,这是关键。如果我错了,请纠正我。您可以启用ETW提供程序,该提供程序每1ms触发一次事件,并具有所有运行进程的堆栈跟踪。你可以通过这种方式让应用程序本身成为示例。最简单的方法是将perfview.exe作为资源提供,提取它并使用命令行开关运行它。它会将跟踪数据写入一个众所周知的文件格式,可以在另一台机器上打开。我没有从这个问题中了解到对Windows的要求。ETW仅适用于Windows。一个跨平台的评测库无论如何都必须使用两个不同的评测引擎。