2008-10-03 60 views
4

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

编辑我说的不是方法体的静态分析 - 我指的是执行指令的实际数量 - 所以,如果,例如,方法体包括一个循环,则将被计为无论多少指令构成循环*循环迭代的次数都会增加。

+0

你为什么不想要使用时间?或者说高分辨率计时器的滴答计数?正如几位人士指出的,并非所有IL指令都具有相同的复杂性。 – 2008-10-03 07:14:08

+0

因为我比执行多长时间执行的指令更感兴趣。 – 2008-10-03 07:28:24

+0

当然,并非所有的指令都需要相同的时间来执行?你实际上试图优化你的代码,使用IL指令的数量可能会产生误导。 – hwiechers 2008-10-03 13:37:24

回答

4

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

你还没有表明你的意图,知道将被解释的IL指令的数量。考虑到方法体的IL计数和机器代码指令的实际数量之间只有松散的相关性,我没有看到知道这个数字会达到什么(除了满足你的好奇心)。

1

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

即使使用现有的IL /托管装配读/写项目,这将是一个非常艰巨的任务。

当然,您的计数器记录的一些指令可能会在即时编译到x86/ia64/x64的过程中得到优化,但这是一个风险,您必须尝试基于摘要进行配置文件像IL这样的语言。

1

您可以使用具有托管界面的ICorDebug。在方法开始时查找一个中断点,并通过编程直到它离开方法。

但是,我不确定度量标准的用处有多大,人们倾向于使用时间来处理这类问题。一些IL指令比其他指令更昂贵。

0

我使用Code Metrics在增加反射

的CodeMetrics附加分析和 计算你的组件数的代码质量度量 。此加载项使用 反射器来计算传统度量标准 (例如圈复杂度或更多 直接的度量值,例如方法中的局部变量数 )。 所有结果都可以保存到文件中。

安装插件。选择一个装配和装载方法指标。它会告诉你一个CodeSize,CyclomaticComplexity,指令编号等的网格。

0

我知道你不想要静态计数。但是,每个弧的静态IL计数加上弧一起执行的次数将为您提供IL计数。你需要对每个弧进行测量,这需要插入一个计数器。

(弧是的,你不能在跳跃或缩小的指令序列。如果你执行的第一条指令,你永远执行的最后,等)

相关问题