【发布时间】:2010-11-03 11:43:49
【问题描述】:
我有一个类 X 的实现,它有两个指向两条信息的指针。我编写了一个新的实现,类 Y,它只有一个指向结构的指针,该结构包含作为相邻成员的两条信息。 X 和 Y 的方法通常只需要操作其中一条信息,但提供了一个 get() 方法,该方法返回指向第二条的指针(在这种情况下,X 类只返回其指向该条的指针,Y 类返回地址结构的第二个成员)。在正常使用中,对 X 和 Y 方法的调用将穿插调用 get() 并处理返回的第二个部分。
我希望在现实生活中应该有性能改进,因为这两条信息在 Y 类实现中的内存中彼此相邻(因为它们是结构的相邻成员),但我我在我编写的基准测试中没有看到任何差异(在大循环中对 X 和 Y 方法的调用穿插在它们的第二部分上)。我怀疑这是因为在我的测试中,无论哪种情况,一切都适合缓存。我还不想在我的真实应用程序中尝试这个,因为 X 和 Y 的语义在其他与此优化无关的微妙方式上有所不同,并且移植使用的应用程序将是一些工作,这些基准应该有助于证明这样做是合理的首先工作。
由于更好的缓存局部性,观察性能差异的最佳方法是什么?如果我在一个等于两次调用之间缓存大小的数组上做一堆虚拟工作就足够了吗?或者我是否想在一个略小于缓存大小的数组上工作,以便对我的类的实例进行工作会导致事情落入和出缓存?我不确定如何编写对编译器优化和不同缓存大小具有鲁棒性的代码。
【问题讨论】:
标签: c++ performance pointers caching benchmarking