C++,缓存局部性改进的基准测试方法?

标签 c++ performance pointers caching benchmarking

我有一个 X 类的实现,它有两个指向两条信息的指针。我已经编写了一个新的实现,类 Y,它只有一个指向结构的指针,该结构将两条信息一起作为相邻成员包含在内。 X 和 Y 的方法通常只需要操作其中一条信息,但提供了一个返回指向第二条信息的指针的 get() 方法(在这种情况下,X 类只返回指向那条信息的指针,Y 类返回地址结构的第二个成员)。在正常使用中,对 X 和 Y 的方法的调用将穿插在对 get() 的调用中,并对返回的第二部分进行处理。

我希望在现实生活中应该有性能改进,因为这两条信息在 Y 类实现中的内存中彼此相邻(因为它们是结构的相邻成员),但我'我没有发现我编写的基准测试有任何差异(穿插调用 X 和 Y 的方法,并在大循环中处理它们的第二部分)。我怀疑这是因为在我的测试中,无论哪种情况,所有内容都适合缓存。我还不想在我的真实应用程序中尝试这个,因为 X 和 Y 的语义在与此优化无关的其他细微方面有所不同,并且移植使用的应用程序将是一些工作,这些基准应该有助于证明这样做的合理性工作放在首位。

观察由于更好的缓存局部性而导致的性能差异的最佳方法是什么?如果我在两次调用之间对一个等于缓存大小的数组做一堆虚拟工作就足够了吗?或者我是否想在一个略小于缓存大小的数组上工作,以便在我的类实例上工作会导致缓存进出缓存?我不确定如何编写针对编译器优化和不同缓存大小的稳健代码。

最佳答案

如果您使用的是 Linux,则使用 Cachegrind连同KCacheGrind可能会更深入地了解您的缓存的行为方式。

关于C++,缓存局部性改进的基准测试方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1003965/

相关文章:

c++ - 确保在 C++ 中调用析构函数的信号处理

php - 试图获取非对象的属性和类似错误 - 性能受到影响?

sql - 数组和连接之间的 Postgresql 性能比较

c++ - 通过 C++ 中的非静态函数设置对 C 函数指针的回调

ios - swift 中的函数指针

c++ - 将函数用作非类型模板参数时出错

c++ - 在类外初始化一个私有(private)静态字段(本例中private的意思)并调用静态函数

java - 将通用 jar 保留在服务器库中,然后将其作为 war 分发的一部分是否更有效?

c++ - 指向包含 vector<int> 问题的实例类的指针

c++ - 如何找到当前目录?