我感兴趣的是在用c++编写并在linux上运行的程序中查找特定函数的内存访问数。为了找出内存访问的次数,我正在使用华润的缓存。我使用以下命令获取内存访问:
cg_annotate --show=Dr,Dw cachegrind.out.25329 |tee log.txt该函数的内存访问次数如下所示:
379,010,475 697,368,671 ???:CheckInput(std::string)现在基本上我有三个函数,我想根据内存访问的数量对这三个函数进行比较。现在我想说清楚,这是做比较的正确方法吗?我是否需要获取平均内存访问次数,还是每个函数只需要读取一次内存总访问量?其次,我是否可以得出结论,内存访问次数较少的内存访问(内存reads+memory写入)是一个快速函数?
发布于 2014-03-14 20:05:06
查看cache差事并不是单独确定函数性能的好方法。这样的测试不能很好地指示函数在实际使用中如何执行分支预测和缓存命中率等操作。
Cache差伦经常可以告诉您为什么给定的实现在实践中是缓慢的,但是您需要在对整个二进制/数据进行有代表性的执行时运行它。
还有几件事要注意:
原始dr/dw不能很好地反映性能,因为它们没有告诉您缓存命中率的任何信息。在其他条件相同的情况下,从L1缓存读取1000个值的函数要比从内存中读取单个值导致页面错误的函数要快,并且必须从虚拟内存加载页面。
你不会看到任何失败的分支预测。在所有其他条件相同的情况下,在分支预测上表现不佳的函数将比构造为在分支预测上执行良好的等效函数要慢得多。
编辑
因为你没有透露任何细节,我不知道你在做什么。但假设你写了这样的测试:
for (int i = 0; i < 100000; ++i) {
func1("test string");
}
for (int i = 0; i < 100000; ++i) {
func2("test string");
}这并不代表一个实际的程序将如何使用这个函数(因此我说过使用有代表性的数据)。正因为如此,这个测试毫无价值。这是一个“微基准”。在第一次通过函数时,所有内容都可以放在缓存中,而且分支预测应该比实际使用情况要好得多,因为您总是使用相同的输入。
要编写适当的性能测试,请问自己“我将如何在我的应用程序中使用这个函数”,并编写测试来模仿它。更好的是,在您的应用程序中实际配置函数。没有申请?那么你的优化方式太快了(除非你的兴趣纯粹是学术性的)。
由于我在最初的回答中指出的原因,内存访问的原始计数不会告诉您函数的性能。部分原因是并非所有内存访问都是平等创建的。根据读取内存的位置,访问时间( Approximate cost to access various caches and main memory?)有数量级的差异。除此之外,还有更多的事情要做,不仅仅是内存访问。您可以编写一个函数,对存储在寄存器中的内容执行数十亿次操作。
你好像很专注于记忆的存取..。你试过通读侧写吗?
https://stackoverflow.com/questions/22413292
复制相似问题