内存数据布局与算法性能

时间:2015-01-27 06:39:17

标签: performance algorithm memory low-latency

内存中数据的布局如何影响算法性能? 例如,合并排序是已知的O(n log n)的计算复杂度。 但在现实世界的机器中,处理算法会将内存块加载/卸载到CPU缓存/ CPU寄存器中,并在其上花费辅助时间。 要排序的集合元素可能在整个内存中非常分散,我想知道它会导致性能降低而不是对收集到的元素进行排序。

是否有必要考虑集合如何真正将数据存储在内存中?

3 个答案:

答案 0 :(得分:3)

  1. 就大O符号而言 - 没有。从中读取每个块的时间 RAM到cpu缓存受一些常量限制,让它为C,所以均匀 如果你需要在RAM的每次迭代中加载每个元素 缓存,你需要O(C*nlogn)时间,但是C是 常数 - 它仍然是O(nlogn)时间复杂度。
  2. 在现实世界的应用程序中,特别是在处理实时应用程序时,缓存性能确实是一个因素,应该加以考虑,因此访问数据的顺序可能很重要。这就是为什么quicksort通常被认为“更快”的原因之一 - 它往往具有良好的缓存性能。
    另外 - 有一些算法是为了享受“两个世界中最好的”而开发的 - O(nlogn)最坏情况下有更好的常数,例如Timsort
  3. 然而,根据经验,您通常应首先实施“简单方法”,然后进行基准测试以确定其是否足够快,如果不是,则进行分析 - 并优化瓶颈。如果您尝试优化代码的每一部分以获得最佳缓存性能 - 您可能永远不会完成它的编写。

答案 1 :(得分:1)

分析,分析,分析。

现代计算机架构变得如此复杂,以至于无法准确预测运行时间。你应该更喜欢实验方法。

另请注意,运行时间不再具有确定性,您应该采用统计方法。

架构杀死了算法师。

答案 2 :(得分:0)

  

内存中数据的布局如何影响算法性能?

布局非常重要,特别是对于大量数据,因为即使对于现代CPU,访问主内存仍然很昂贵: http://mechanical-sympathy.blogspot.ru/2013/02/cpu-cache-flushing-fallacy.html

你的算法可能会花费很多时间在每个缓存未命中: http://mechanical-sympathy.blogspot.ru/2012/08/memory-access-patterns-are-important.html

此外,现在计算机科学中有一个称为缓存友好数据结构和算法的特殊领域。例如,请参阅Google搜索: http://www.cc.gatech.edu/~bader/COURSES/UNM/ece637-Fall2003/papers/LFN02.pdf 等等