在运行C程序时,有没有办法知道缓存命中率或缓存内存的一些行为?
我正在尝试比较函数的两个不同实现,以了解缓存的行为。
在运行C程序时,有没有办法知道缓存命中率或缓存内存的一些行为?
我正在尝试比较函数的两个不同实现,以了解缓存的行为。
是的,有一些工具可以做到这一点,但正如人们所期望的那样,它们是特定于平台/架构的。它们也可能有编译器限制:
Cachegrind:缓存和分支预测分析器。这可能是最接近您所寻找的内容。您可以通过 valgrind
(假设使用Linux内核)来使用它。
valgrind --tool=cachegrind your_program
它有一些更多的微调选项。请查看文档。在 Cachegrind
中的典型转储/输出如下(从网站中剥离)
==31751== I refs: 27,742,716
==31751== I1 misses: 276
==31751== LLi misses: 275
==31751== I1 miss rate: 0.0%
==31751== LLi miss rate: 0.0%
==31751==
==31751== D refs: 15,430,290 (10,955,517 rd + 4,474,773 wr)
==31751== D1 misses: 41,185 ( 21,905 rd + 19,280 wr)
==31751== LLd misses: 23,085 ( 3,987 rd + 19,098 wr)
==31751== D1 miss rate: 0.2% ( 0.1% + 0.4%)
==31751== LLd miss rate: 0.1% ( 0.0% + 0.4%)
==31751==
==31751== LL misses: 23,360 ( 4,262 rd + 19,098 wr)
==31751== LL miss rate: 0.0% ( 0.0% + 0.4%)
对于Windows,还有WinCachegrind。