我读到
了解处理器如何使用时间的一种方法是查看硬件计数器。为了帮助进行性能调整,现代处理器在执行代码时跟踪各种计数器:执行的指令、各种类型的存储器访问的数量,遇到的分支的数量等等。要阅读计数器,您将需要一个工具,如Visual Studio中的探查器2010 Premium或Ultimate,AMD代码分析师或英特尔VTune。
那么,通过像使用PerformanceCounter这样的编码来执行这么多指令的方法是什么呢?
有什么方法可以计算DotTrace、Ants、VS探查器等指令的命中率吗?
对于VS档案器:
查看当前平台上支持的所有CPU计数器的列表
在性能资源管理器中,右键单击性能会话,然后单击属性。
执行以下操作之一:
- 单击"采样",然后从"采样"事件列表中选择"性能计数器"。CPU计数器列在可用性能计数器中。注意:单击"取消"可返回到以前的采样配置
-或-
- 选择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可能随时发生,它将反映在测量中。