内存中数据的布局如何影响算法性能? 例如,合并排序是已知的O(n log n)的计算复杂度。 但在现实世界的机器中,处理算法会将内存块加载/卸载到CPU缓存/ CPU寄存器中,并在其上花费辅助时间。 要排序的集合元素可能在整个内存中非常分散,我想知道它会导致性能降低而不是对收集到的元素进行排序。
是否有必要考虑集合如何真正将数据存储在内存中?
答案 0 :(得分:3)
C
,所以均匀
如果你需要在RAM的每次迭代中加载每个元素
缓存,你需要O(C*nlogn)
时间,但是C
是
常数 - 它仍然是O(nlogn)
时间复杂度。O(nlogn)
最坏情况下有更好的常数,例如Timsort。然而,根据经验,您通常应首先实施“简单方法”,然后进行基准测试以确定其是否足够快,如果不是,则进行分析 - 并优化瓶颈。如果您尝试优化代码的每一部分以获得最佳缓存性能 - 您可能永远不会完成它的编写。
答案 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 等等