Performance 如何检查应用程序是cpu绑定还是内存绑定?

Performance 如何检查应用程序是cpu绑定还是内存绑定?,performance,memory,caching,Performance,Memory,Caching,我有一个应用程序,它很少做计算CPU工作,但主要是内存访问(分配对象并移动它们,很少有数字或算术代码) 在CPU空闲的情况下,如何衡量我在内存访问延迟(由于缓存未命中)上花费的时间份额 我应该注意到,该应用程序正在Hyper-V guest上运行;我不确定它是否会造成任何困难,但它可能会造成任何困难。除非系统内置了延迟,否则只需在专用机器上运行应用程序一段时间,然后检查CPU计数器。如果应用程序使用了它可以访问的100%的CPU核心,那么它是受CPU限制的。否则,它会将时间花在其他事情上,如内存

我有一个应用程序,它很少做计算CPU工作,但主要是内存访问(分配对象并移动它们,很少有数字或算术代码)

在CPU空闲的情况下,如何衡量我在内存访问延迟(由于缓存未命中)上花费的时间份额


我应该注意到,该应用程序正在Hyper-V guest上运行;我不确定它是否会造成任何困难,但它可能会造成任何困难。

除非系统内置了延迟,否则只需在专用机器上运行应用程序一段时间,然后检查CPU计数器。如果应用程序使用了它可以访问的100%的CPU核心,那么它是受CPU限制的。否则,它会将时间花在其他事情上,如内存分配和IOs。

您可以随时对应用程序进行分析,查看它在哪里花费了大部分时间

通过这种方式,您可以了解应用程序的行为和数据访问模式

如果您使用的是Linux,那么您可以使用各种各样的分析工具,如:

  • +
编辑:

要更准确地测量处理器性能和内存访问,您还可以尝试。是关于如何在英特尔处理器上使用它的说明,尽管我自己还没有尝试过


您可能还发现另一个有用的工具是。

那么,CPU使用性能计数器中是否不包括内存访问延迟?我不认为它们被明确排除在外,但这种粒度很难确定。您的进程获得CPU的时间是固定的,但等待缓存加载仍然算作CPU“使用”,因为您的进程没有被逐出。我不知道在不窥探总线的情况下,是否可以真正获取内存等待时间的硬数字。使用
Callgrind
可以获取
L1
L2
缓存未命中的计数器。使用分析信息聚合这些数据,您就可以估计应用程序的数据访问模式的性能。您知道,我已经分析了应用程序。它有一个相当平坦的性能配置文件,其中大部分时间由各种内存访问函数(如memset、memmove等)占用(实际上这是一个运行在Windows上的.NET应用程序,这些函数在对象构造期间由CLR调用)。我想知道他们的时间是由CPU还是内存总线支配。你可以试试AMD CodeAnalyst Performance Analyzer:或相关的: