首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >怎样才能得到执行指令的数量?

怎样才能得到执行指令的数量?
EN

Stack Overflow用户
提问于 2015-04-22 08:57:13
回答 2查看 2K关注 0票数 3

我读到了

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

那么,如何通过像使用PerformanceCounter这样的编码来执行这个数目的指令呢?

有没有办法计算DotTrace、Ants、VS分析器等指令的命中量呢?

EN

回答 2

Stack Overflow用户

发布于 2015-04-22 09:20:04

对于VS Profiler

查看当前平台支持的所有CPU计数器的列表。 在Performance中,右键单击性能会话,然后单击Properties。 执行下列操作之一:

  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

票数 1
EN

Stack Overflow用户

发布于 2015-04-22 12:40:52

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

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

但你应该清楚自己在做什么。函数的第一次调用与第二次调用之间由于JITting时间不同。如果您的方法分配内存- GC可能在调用您的方法时随时发生,它将反映在度量中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29792471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档