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

时间:2008-10-03 05:43:12

标签: c# .net benchmarking cil

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

编辑我不是指方法体的静态分析 - 我指的是执行的实际指令数 - 例如,如果方法体包含一个循环,无论多少指令组成循环*迭代循环的次数,计数都会增加。

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我使用Code Metrics添加到Reflector

  

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

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

答案 4 :(得分:0)

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

(弧是一系列无法​​跳入或跳出的指令。如果执行第一条指令,则总是执行最后一条指令等。)