我读到了
了解处理器如何使用时间的一种方法是查看硬件计数器。为了帮助性能调优,现代处理器在执行代码时跟踪各种计数器:执行指令的数量、各种类型的内存访问的数量、遇到的分支数等等。要读取计数器,您将需要一个工具,如VisualStudio2010Premium或终极版中的分析器、AMD分析师或英特尔VTune。
那么,如何通过像使用PerformanceCounter这样的编码来执行这个数目的指令呢?
有没有办法计算DotTrace、Ants、VS分析器等指令的命中量呢?
发布于 2015-04-22 09:20:04
查看当前平台支持的所有CPU计数器的列表。 在Performance中,右键单击性能会话,然后单击Properties。 执行下列操作之一:
-或者-
无法从程序中访问完整的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
https://stackoverflow.com/questions/29792471
复制相似问题