代码之家  ›  专栏  ›  技术社区  ›  Erik Forbes

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

  •  4
  • Erik Forbes  · 技术社区  · 16 年前

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

    编辑

    5 回复  |  直到 16 年前
        1
  •  4
  •   Drew Noakes    16 年前

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

    您还没有说明您打算了解将被解释的IL指令的数量。考虑到方法体的IL计数与机器代码指令的实际数量之间只有松散的相关性,我看不出知道这个数字能实现什么(除了满足您的好奇心)。

        2
  •  1
  •   ZeroBugBounce    16 年前

    这可不容易。我 您可以使用在IL块之后执行的性能计数器代码对汇编后编译进行指令插入。例如,如果方法的某个部分将int加载到堆栈中,然后在优化代码下使用该int执行静态方法,则可以记录int加载和调用的计数2。

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

    当然,计数器记录的一些指令可能会在实时编译到x86/ia64/x64的过程中得到优化,但如果您试图基于抽象语言(如IL)进行评测,就必须冒这个风险。

        3
  •  1
  •   Sam Saffron James Allen    16 年前

    你可以用 ICorDebug

    然而,我不确定这个指标有多有用,人们倾向于用时间来做这类事情。一些IL指令比其他指令更昂贵。

        4
  •  0
  •   jop    16 年前

    Code Metrics

    CodeMetrics插件分析和 计算多个代码质量度量 在您的程序集上。此加载项使用 用于计算经典度量的反射器 直截了当的,比如 所有结果都可以保存到文件中。

    安装插件。选择程序集并加载方法度量。它将向您展示一个包含代码大小、循环复杂度、指令类型等的网格。

        5
  •  0
  •   MSalters    16 年前

    我知道你不想要静态计数。但是,每个arc的静态IL计数,加上arc一起执行的次数,可以得到IL计数。为此,您需要为每个弧插入仪器,这需要插入一个计数器。

    (arc是不能跳入或跳出的指令序列。如果执行第一条指令,则始终会执行最后一条指令,以此类推。)