我想做一个C#程序的一些基准测试,但我不希望使用时间作为我的载体 - 我想算的,它们会在特定的方法调用执行IL指令数。 这可能吗?
编辑我不是说一个方法体的静态分析-我指的是执行指令的实际数量-所以,如果,例如,方法体包括一个循环,计数就由然而,许多指令都增加了循环*的次数循环迭代。
我想做一个C#程序的一些基准测试,但我不希望使用时间作为我的载体 - 我想算的,它们会在特定的方法调用执行IL指令数。 这可能吗?
编辑我不是说一个方法体的静态分析-我指的是执行指令的实际数量-所以,如果,例如,方法体包括一个循环,计数就由然而,许多指令都增加了循环*的次数循环迭代。
我不认为这是可能做到你想做的。 这是因为IL是JIT(刚刚在时间)在编译过程中仅使用。 通过时间的方法是运行IL已经被翻译成机器码。 因此,虽然有可能以静态计算在给定的方法/类型/装配的IL指令的数量,有在运行时没有这个概念。
您还没有知道的是会被解释IL指令数表示你的意图。 鉴于只有有一个方法体的IL计数和机器代码指令的实际数量之间的松散关系,我看不出有什么知道这个数字会达到(超过满足你的好奇心等)。
嗯,这并不容易。 我想你可以检测你自己组装后,编译IL块之后执行的性能计数器代码。 例如,如果有这样的装载一个int到堆栈的方法的部分,然后执行使用这个int下优化的代码,可以记录对INT负载2的计数,并调用的静态方法。
即使是使用现有的IL /托管程序读取/写入的项目,这将是一个非常艰巨的任务拉断。
当然,前提是你的记录计数器一些指令可能会在刚刚即时编译成86 / IA64 / x64的优化掉,但是这是你必须采取任何试图基于如IL抽象lanaguage剖析风险。
你可以使用ICorDebug其中有一个管理界面。 查克在方法和programmaticly步通过代码,直到它离开方法开始一个破发点。
但是,我不知道该指标将多么有用,人们倾向于使用时间这种东西。 有的IL指令是比别人更贵。
我用的是代码度量中添加反射
该CodeMetrics加载分析和对您的组件数计算代码质量指标。 此加载使用反射来计算的经典指标,如圈复杂或更简单的,如在方法的局部变量的数量。 所有的结果都可以保存到一个文件中。
安装插件。 选择的组件和负载方法度量。 它会告诉你CodeSize,循环复杂度,教学#等网格
我知道你不想静态计数。 然而,静态IL每弧算,再加上时代的弧被一起执行数给你IL计数。 你需要仪器每个弧这一点,这需要插入一个计数器。
(弧是的,你不能或缩小跳转指令序列。如果你执行的第一条指令,你永远执行的最后,等)