我读了那个
了解处理器如何使用时间的一种方法是查看 硬件计数器。为了帮助进行性能调整,现代化 处理器在执行代码时跟踪各种计数器:数量 执行的指令,各种类型的内存访问次数, 遇到的分支数量,等等。阅读 计数器,你需要一个工具,如Visual Studio中的探查器 2010 Premium或Ultimate,AMD Code Analyst或Intel VTune。
那么通过使用PerformanceCounter进行编码来实现它的方法是什么并且执行了这么多指令?
有没有办法计算像DotTrace,Ants,VS profiler这样的指令呢?
答案 0 :(得分:1)
对于VS Profiler:
查看当前平台支持的所有CPU计数器列表的列表
在Performance Explorer中,右键单击性能会话,然后单击“属性”。
执行以下操作之一:
- 单击“采样”,然后从“采样事件”列表中选择“性能计数器”。 CPU计数器列在可用性能计数器中。 注意单击“取消”返回上一个采样配置。
醇>-OR -
- 选择CPU Counters,然后选择Collect CPU Counters。 CPU计数器列在可用计数器中。 注意单击“取消”返回上一个计数器集合配置。
醇>
您无法从程序访问完整的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可能会在调用您的方法时随时发生,它将反映在测量中。