Jos*_*vin 8 c++ performance benchmarking caching pointers
我有一个类X的实现,它有两个指向两条信息的指针.我编写了一个新的实现,类Y,它只有一个指向结构的指针,该结构包含两条信息作为相邻的成员.X和Y的方法通常只需要操作其中一条信息,但提供一个get()方法返回指向第二块的指针(在这种情况下,类X只返回它指向该块的指针,类Y返回地址结构的第二个成员).在正常使用中,调用X和Y的方法将散布在调用get()并对返回的第二部分进行处理.
我希望在现实生活中你应该有一个性能提升,现在这两个信息在Y类实现的内存中是彼此相邻的(因为它们是结构的相邻成员),但是我没有看到我写过的基准测试的任何不同(散布调用X和Y的方法,在大循环中处理他们的第二部分).我怀疑这是因为在我的测试中,所有内容都适合缓存.我不想在我的真实应用程序中尝试这个,因为X和Y的语义在与此优化无关的其他微妙方式上有所不同,并且移植使用应用程序将是一些工作,并且这些基准应该有助于证明这样做工作在第一位.
由于更好的缓存局部性,观察性能差异的最佳方法是什么?如果我在一个数组上做一堆虚拟工作,等于调用之间的缓存大小就足够了吗?或者我是否希望在稍微小于缓存大小的数组上进行工作,以便在我的类实例上工作会导致事物进入和退出缓存?我不确定如何编写针对编译器优化和不同高速缓存大小的强大功能.
如果我正确理解你的情况(如果不正确,请纠正我),那么它是其中的六个,或者是其他的六个。
在类 X 中,您需要一个指针来查找任一信息。在 Y 类中,您需要对第一个进行一次查找,对第二个进行两次查找(获取第一个,然后获取偏移量)。这是为了另一个内存访问而牺牲“局部性”。不幸的是,编译器仍然很擅长浪费总线时间在 RAM 中查找单词。
如果可能的话,通过直接在相关类中保存两条目标信息(即每个目标信息都是它自己的类成员),而不是使用这些指针进行不必要的间接访问,您将获得最佳结果。没有看到任何代码,这就是我所能说的。
无论如何,通过研究应用程序的算法复杂性,您将比通过微优化类定义中的两个变量获得更多的性能。另外一个好主意是使用分析工具来(客观地)查看瓶颈在哪里(gprof 在 *nix 系统上很常见)。您希望专门增加本地缓存有什么明显的原因吗?