优化者可以摆脱空间局部性的不良用途吗?我正在维护一些由其他人编写的代码,并且他们的许多数组都以偶然的顺序声明,并且每次调用时都会以不同的方式迭代。
由于代码的复杂性,每次循环数组时尝试重新管理都需要花费大量时间。我对阅读汇编语言不够熟练,能够准确地说出不同的优化级别,但我的问题是,
在编写程序时,局部性是否很重要,或者这样做是否已经过优化,所以我不担心它?
答案 0 :(得分:3)
获得正确的位置很重要,因为它可以在运行时产生差异两个数量级(如果你有页面错误,则为5-6个数量级)。
除了真正的编译器通常不会自动处理这个事实(正如Joel Falcou所说),即使是假设的编译器也会很难做到这一点一个东西。在许多情况下,编译器执行此类操作甚至可能无效,并且非常难以来预测它何时或何时不是。
例如,假设您有在CPU上计算的顶点数据,以及上传到OpenGL或DirectX等图形API的顶点数据。您已经同意该API的某个顶点数据布局。现在,编译器认为以某种方式重新排列布局更有效。砰,你死了。
编译器应该如何知道?
假设您有一些数组和一些指针,一些指针别名,或者某些指针由于某种原因指向数组的中间,其他指向开头。编译器认为以不同的顺序执行某些操作更有效,用另一个顺序覆盖一个结果 抛开数据损坏问题,假设这些数组“有些大”,所以它们肯定会被动态分配而不是堆栈。这意味着从编译器的角度来看,它们的起始地址是“非确定性的”甚至是“随机的”。编译器如何在编译时做出决定 - 不知道一半的细节?
答案 1 :(得分:1)
很少有编译器处理地点的数据布局。它仍然是一个活跃的研究领域。