我想对 C# 进程进行一些基准测试,但我不想使用时间作为向量 - 我想计算在特定方法调用中执行的 IL 指令的数量。这可能吗?

编辑 我并不是指方法体的静态分析 - 我指的是执行的实际指令数 - 因此,例如,如果方法体包含循环,则计数将增加,无论指令的数量如何循环 * 循环迭代的次数。

有帮助吗?

解决方案

我认为不可能做你想做的事。这是因为IL仅在JIT(即时)编译期间使用。当该方法运行时,IL已被转换为本机机器代码。因此,尽管可以静态地计算给定方法/类型/汇编中的IL指令的数量,但在运行时没有这个概念。

您尚未表明您打算知道将要解释的IL指令的数量。鉴于方法体的IL计数与机器代码指令的实际数量之间只有松散的相关性,我无法看到知道这个数字会达到什么(除了满足你的好奇心)。

其他提示

嗯,这并不容易。我认为你可以使用在IL块之后执行的性能计数器代码来编译你的程序集。例如,如果你有一个方法的一部分将一个int加载到堆栈上,然后在优化的代码下使用该int执行一个静态方法,你可以为int加载和调用记录一个2的计数。

即使使用现有的IL /托管程序集读/写项目,这也是一项非常艰巨的任务。

当然,您的计数器记录的一些指令可能会在即时编译到x86 / ia64 / x64时被优化掉,但这是一个冒险尝试根据抽象语言进行分析的风险像IL。

您可以使用 ICorDebug 托管接口。在方法开始时查找断点并以编程方式逐步执行代码,直到离开方法。

但是,我不确定该指标有多么有用,人们倾向于花时间使用这种东西。一些IL指令比其他指令更昂贵。

我使用代码指标添加到反射器

  

CodeMetrics加载项分析和   计算几个代码质量指标   在你的集会上。此加载项使用   反射器计算经典指标   例如圈复杂度或更多   直截了当的   方法中局部变量的数量。   所有结果都可以保存到文件中。

安装插件。选择装配和加载方法指标。它将显示一个包含CodeSize,CyclomaticComplexity,#of Instruction等的网格

我知道你不想要静态计数。但是,每个弧的静态 IL 计数加上弧一起执行的次数即可得出 IL 计数。为此,您需要对每个弧进行检测,这需要插入一个计数器。

(弧是一系列不能跳入或跳出的指令。如果您执行第一条指令,您将始终执行最后一条指令,依此类推)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top