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



我读到

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

那么,通过像使用PerformanceCounter这样的编码来执行这么多指令的方法是什么呢?

有什么方法可以计算DotTrace、Ants、VS探查器等指令的命中率吗?

对于VS档案器:

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

在性能资源管理器中,右键单击性能会话,然后单击属性。

执行以下操作之一:

  1. 单击"采样",然后从"采样"事件列表中选择"性能计数器"。CPU计数器列在可用性能计数器中。注意:单击"取消"可返回到以前的采样配置

-或-

  1. 选择CPU计数器,然后选择收集CPU计数器。CPU计数器列在可用计数器中。注意:单击"取消"可返回到以前的计数器集合配置

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

您可以使用RDPMC指令或__readpmc MSVC编译器内部,这是一样的。

但是,Windows通过将CR4.PCE设置为0来禁止用户模式应用程序执行此指令。据推测,之所以这样做,是因为每个计数器的含义是由MSR寄存器决定的,这些寄存器只有在内核模式下才能访问。换句话说,除非你是一个内核模式模块(例如设备驱动程序),否则如果你试图执行这个指令,你就会遇到"特权指令"陷阱。

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

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

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

已经回答了您的问题,所以我认为这是重复的问题。

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

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

相关内容