c#:运行时代码分析 - 任何现有的库?

Posted

技术标签:

【中文标题】c#:运行时代码分析 - 任何现有的库?【英文标题】:c# : runtime code profiling - any existing libraries? 【发布时间】:2010-11-12 09:03:40 【问题描述】:

我有一个应用程序,用户可以将节点连接在一起以执行实时计算。 我希望能够向用户显示 CPU 使用百分比以显示正在使用的可用 CPU 时间,以及每个节点的细分以便能够发现问题区域。

对于像这样的运行时分析器,是否有任何可用的开源实现? 我可以使用 System.Diagnostics.Process.TotalProcessorTime、秒表/性能计数器编写自己的代码,但我宁愿使用经过尝试和测试的东西,如果可能的话,以后可能会为我提供更详细的信息。

编辑: 我不是在寻找独立的分析器,因为我想在我的应用程序的 UI 中显示实时统计信息。

【问题讨论】:

听起来您只需要每台机器或进程的 CPU 使用率,而不是像代码分析器提供的每个方法的详细分解。 我想要以 % 为单位的总 cpu 使用率,以及每个计算节点的 %。因此,现在获取每个节点的计算开始和结束的性能计数器就足够了,但稍后我可能想添加更多关于 CPU 时间去向的深入信息。 只显示 100%。如果小于,则说明您的代码有问题。 就像使用 IF 语句的程序员不确定自己在做什么一样? :) 【参考方案1】:

您可以尝试具有此功能的商业GlowCode profiler。

或者开源SlimTune,不过还处于测试阶段。

【讨论】:

这作为一个独立的分析器非常棒,但我想在应用程序本身中进行分析,以便在应用程序的 UI 中向用户显示实时统计数据。【参考方案2】:

我假设您正在使用计时器,例如每秒进行 10 次计算,否则您只是在使用 100% 的 CPU(除非您也在执行 I/O)。

您能否设置一个闹钟中断以某个合理的频率(例如 10 或 100 Hz)触发,与程序正在执行的任何其他操作无关,尤其是在 I/O 或其他阻塞时间期间?

然后,对于每个块,只需计算最近 100 次中断中它处于活动状态的次数。那是你的百分比,而且获得它的成本是最低的。

块是否作为子程序相互调用?在这种情况下,在每次中断时,您可能希望捕获块之间的调用堆栈,如果块在堆栈中的某个位置,则它是“活动的”,如果它位于堆栈的末尾,则它是“嘎吱嘎吱”的(不在调用另一个块的过程中,也不在 I/O 中)。然后,您可以在每个块上选择指示它“处理”(在块上求和时不会超过 100%)或“活跃”(在块上求和时可能超过 100%)的时间百分比。

后一个数字的价值在于它不会告诉你时间花在“哪里”,而是告诉你“为什么”。这可以回答诸如“我看到 foo 花费了很多时间,但是我是如何到达 那里?”之类的问题。 I/O 也一样。这也是一个过程,它只发生在其他硬件上。你不想忽略它,因为如果你这样做了,你最终可能会说“我为什么只使用了一小部分 CPU?什么是阻塞?”

【讨论】:

我没有用完计时器,我正在计算和渲染东西,这意味着我受显示器垂直刷新的约束,其他东西也需要时间(例如 GPU)。 @IUsedToBeAPygmy:请注意,即使您的计时器/vsync 以高速率运行,您获取堆栈样本的速率也不必很高。它只需要与另一个不相关。

以上是关于c#:运行时代码分析 - 任何现有的库?的主要内容,如果未能解决你的问题,请参考以下文章

将错误级别分析的 C++ 实现转换为 C#

应用工具 .NET Portability Analyzer 分析迁移dotnet core

Visual Studio 中是不是有任何用于 C# 的第三方分析工具?

MySQL EXPLAIN 自动分析

我可以将现有的 html 主页谷歌分析代码添加到新的 wordpress 主页吗?

SonarQube分析/结果/团队或小组的问题