有没有办法计算执行的IL指令的数量?

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

编辑我不是指方法体的静态分析 – 我指的是执行的实际指令数 – 例如,如果方法体包含一个循环,那么计数会因许多指令而增加循环*迭代循环的次数。

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

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

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

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

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

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

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

我使用Code Metrics添加到Reflector

CodeMetrics加载项分析并计算程序集上的几个代码质量指标。 此加载项使用Reflector计算经典度量,例如圈复杂度或更直接的度量,例如方法中局部变量的数量。 所有结果都可以保存到文件中。

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

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

(弧是一系列指令,你无法跳入或跳出。如果执行第一条指令,你将始终执行最后一条指令,等等)