获取指令执行次数的方法是什么?

时间:2015-04-22 08:57:13

标签: c# .net performance profiler

我读了那个

  

了解处理器如何使用时间的一种方法是查看   硬件计数器。为了帮助进行性能调整,现代化   处理器在执行代码时跟踪各种计数器:数量   执行的指令,各种类型的内存访问次数,   遇到的分支数量,等等。阅读   计数器,你需要一个工具,如Visual Studio中的探查器   2010 Premium或Ultimate,AMD Code Analyst或Intel VTune。

那么通过使用PerformanceCounter进行编码来实现它的方法是什么并且执行了这么多指令?

有没有办法计算像DotTrace,Ants,VS profiler这样的指令呢?

2 个答案:

答案 0 :(得分:1)

对于VS Profiler

  

查看当前平台支持的所有CPU计数器列表的列表

     

在Performance Explorer中,右键单击性能会话,然后单击“属性”。

     

执行以下操作之一:

     
      
  1. 单击“采样”,然后从“采样事件”列表中选择“性能计数器”。 CPU计数器列在可用性能计数器中。   注意单击“取消”返回上一个采样配置。
  2.         

    -OR -

         
        
    1. 选择CPU Counters,然后选择Collect CPU Counters。 CPU计数器列在可用计数器中。   注意单击“取消”返回上一个计数器集合配置。
    2.   

您无法从程序访问完整的CPU计数器,因为:https://stackoverflow.com/a/8800266/613130

  

你可以使用RDPMC指令或__readpmc MSVC编译器内在,这是一回事。

     

但是, Windows通过将CR4.PCE设置为0来禁止用户模式应用程序执行此指令。可能这样做是因为每个计数器的含义由MSR寄存器确定,这只是MSR寄存器在内核模式下可访问换句话说,除非您是内核模式模块(例如设备驱动程序),否则如果您尝试执行此指令,您将获得“特权指令”陷阱。

(RDPMC是返回CPU计数器的指令)

我要补充一点,通常执行的指令数量是无用的。重要的是用于执行某些代码的CPU时间。每条指令都有不同的CPU时间,因此即使知道它们的数量,也不会知道CPU周期/使用的时间。

如果您想知道某些指令使用的CPU周期,则可以使用ASM指令RDTSC / RDTSCP。在C#中使用它是复杂且非常耗时的(因此使用它足够慢以至于它经常会影响您正在尝试的测量)。如果你有兴趣,几天前我写了一篇关于它的回复:https://stackoverflow.com/a/29646856/613130

答案 1 :(得分:1)

已经回复your question,所以我认为这是重复的问题。

最有可能是WinAPI中的本机方法,您可以通过DLLImport从C#调用它们。但为简单起见,您可以尝试使用here中的第三方包装器。

但你应该清楚地了解你在做什么。在第一次调用你的函数和第二次函数之间会因为JITting时间而有所不同。如果您的方法分配内存 - GC可能会在调用您的方法时随时发生,它将反映在测量中。