有没有一种方法可以计算执行的IL指令的数量?
我想对Cprocess进行一些基准测试,但是我不想将时间用作向量,我想计算在特定方法调用中执行的IL指令的数量。这可能吗?
编辑我不是指对方法主体的静态分析,我指的是要执行的指令的实际数量,因此,例如,如果方法主体包括一个循环,那么不管有多少条指令组成,计数都会增加loop *循环迭代的次数。
解决方案
好吧,这并不容易。我认为我们可以使用在IL块之后执行的性能计数器代码来对汇编后编译进行检测。例如,如果我们有一部分方法将int加载到堆栈上,然后在优化代码下使用该int执行了静态方法,则可以为int加载和调用记录2的计数。
即使使用现有的IL /托管程序集读/写项目,实现这一目标也将是一项艰巨的任务。
当然,在实时编译为x86 / ia64 / x64的过程中,计数器记录的一些指令可能会被优化掉,但这是我们必须冒犯的风险,试图基于像IL这样的抽象语言进行剖析。
我们可以使用具有托管接口的ICorDebug。在方法开始处插入一个断点,并以编程方式逐步遍历代码,直到离开方法为止。
但是,我不确定该度量标准将有多有用,人们倾向于将时间用于此类工作。一些IL指令比其他指令更昂贵。
我将代码度量标准添加到Reflector中
The CodeMetrics add-in analyses and computes several code quality metrics on your assemblies. This add-in uses Reflector to compute classic metrics such as cyclomatic complexity or more straightforward ones such as the number of local variables in a method. All results can be saved to a file.
安装插件。选择一个程序集和加载方法指标。它将显示一个具有CodeSize,CyclomaticComplexity,Instruction等的网格。
我认为我们不可能做任何想做的事情。这是因为IL仅在JIT(即时)编译期间使用。到该方法运行时,IL已转换为本机代码。因此,虽然可以静态地计算给定方法/类型/程序集中的IL指令数,但在运行时没有概念。
我们尚未说明要了解将被解释的IL指令的数量。鉴于方法主体的IL计数与机器代码指令的实际数量之间只有很小的相关性,因此我看不出知道该数量会达到什么(除了满足好奇心之外)。
我知道我们不需要静态计数。但是,每个圆弧的静态IL计数加上圆弧执行的次数一起为我们提供了IL计数。我们需要为此测量每个弧,这需要插入一个计数器。
(弧是一系列指令,我们不能跳入或者跳出。如果执行第一个指令,则始终执行最后一条,依此类推。)