我想对C#进程进行基准测试,但我不想将时间用作向量 - 我想计算在特定方法调用中执行的IL指令的数量。这可能吗?
编辑我不是指方法体的静态分析 - 我指的是执行的实际指令数 - 例如,如果方法体包含一个循环,无论多少指令组成循环*迭代循环的次数,计数都会增加。
答案 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计数。你需要为此设置每个弧,这需要插入一个计数器。
(弧是一系列无法跳入或跳出的指令。如果执行第一条指令,则总是执行最后一条指令等。)