我想找出我的 C++ 代码的缓存效率。我在 UBUNTU 上运行它。如何找到缓存命中或缓存未命中的数量?
另一个问题是:我发现使用time 命令:我的代码的一部分给出了 2133(次要)页面错误,而另一部分给出了 2361(次要)页面错误。(次要)页面错误是否与缓存未命中有关?如果是这样,它是如何相关的。我必须执行一些 I/O 是否会导致(次要)页面错误?
最全面的 linux 分析工具是oprofile,它可以分析单个应用程序或整个系统,并且可以为您提供有关支持缓存未命中等事件的性能计数器的处理器上的缓存未命中(以及它们发生的位置)的详细信息(几乎过去 20 年制造的所有 x86 处理器都支持此类计数器)
页面错误与缓存未命中无关,尽管它们也是性能问题的潜在来源。
写我自己的答案,因为它比克里斯多德的答案的单个评论更长......
您可以使用 oprofile 或 perftool(基本上使用与 oprofile 相同的内核功能)将为您提供缓存命中与未命中。请注意,很难说一个应用程序“应该有多少缓存未命中”或“缓存命中”,您实际上只能将这个数字与同一应用程序的另一次运行进行比较(在调整之后,还可以查看多少它从一次运行到另一次变化可能非常有用)。
我认为页面错误的确切数量并不那么关键 - 它往往会根据“运气”而有所不同。
页面错误是由各种各样的事情引起的。例如分配一大块内存,当页面第一次被使用时,该内存将“不存在”,并且在那个时候,它被标记为存在(并且可能在那个时候也被填充为零)。您还可以从共享库中加载函数获得页面错误,因为它们在共享库初始化时“不存在”。在某些情况下,也可能是应用程序的一部分mmap
用于映射文件,而不是使用文件读/写操作(这可能是您对文件 I/O 的想法)。