【问题标题】:How to account for cache misses in estimating performance?如何在估计性能时考虑缓存未命中?
【发布时间】:2015-11-15 17:08:24
【问题描述】:

通常以 O() 数量级给出性能:O(Magnitude)+K 其中K 通常被忽略,因为它主要适用于较小的Ns。

但是我越来越多地看到底层数据大小主导了性能,但这不是算法复杂性的一部分

假设algorithm AO(logN) 但使用O(N) 空间,algorithm BO(N) 但使用O(logN) 过去的情况是algorithm A 更快。现在,由于多层缓存中的缓存未命中,algorithm B 可能会更快地处理大数字,如果它有较小的 K,则可能是小数字

问题是你如何表示这个?

【问题讨论】:

  • 我想如果我刚从计算机科学课上出来,我的脑海里会充满 big-O 和缓存未命中,但那是因为很难找到一个不得不工作的计算机科学老师大量软件的性能。这是a counterexample,正如@amit 所说,根据经验处理它。
  • 如果您想要一个良好的性能评估,您需要在您想要评估的特定硬件上运行您的算法。您的帖子泛泛而谈,您认为 O(logN) 实现比 O(N) 实现更糟糕的是什么算法?数据集的大小以及您在什么硬件上运行。如果不指定处理器/内存/架构,则无法解释缓存未命中。

标签: algorithm performance caching


【解决方案1】:

缓存未命中在大 O 表示法中不考虑在内,因为它们是常数因素。

即使您悲观地假设每次数组查找都将是缓存未命中,假设缓存未命中需要 100 个周期(这个时间是恒定的,因为我们假设随机存取存储器),而不是迭代长度为 @ 的数组987654322@ 将花费100*n 个周期来处理缓存未命中(+ 循环和控制开销),一般来说它仍然是O(n)

经常使用大 O 的一个原因是因为它与平台无关(好吧,至少在谈到 RAM 机器时)。如果我们将缓存未命中考虑在内,那么每个平台的结果都会有所不同。


如果您正在寻找将常数考虑在内的理论符号 - 您正在寻找 tilde notation

另外,这就是为什么“大 O 表示法”很少适用于大规模或时间关键型系统,并且这些系统会不断分析以发现瓶颈,开发人员会在本地改进这些瓶颈,所以如果您正在寻找真正的性能- 凭经验做,不要满足于理论符号。

【讨论】:

    【解决方案2】:

    嗯,使用 O(N) 命名法抽象出一些重要的细节,这些细节通常仅在 N 接近无穷大时才无关紧要。在 N 小于无穷大的情况下,这些细节可以而且通常是最重要的因素。为了帮助解释,考虑如果一个术语被列为 O(N^x),它只是指定了 N 中最重要的因素。实际上,性能可以描述为:

    aN^x + bN^(x-1) +cN^(x-2) + ... + K

    所以当 N 接近无穷大时,主导项变为 N^x,但显然在 N 的值小于无穷大时,主导项可能是次要项之一。查看您的示例,您给出了两种算法。我们将算法 A 称为提供 O(N) 性能的算法,将提供 O(logN) 性能的算法称为算法 B。实际上,这两种算法具有以下性能特征:

    性能 A = aN + b(log N) + c

    性能 B = x(log N) + y

    如果您的常数值为 a=0.001 和 x=99,999,您可以看到 A 如何提供比 B 更好的性能。此外,您提到一种算法会增加缓存未命中的可能性,而这种可能性取决于大小的数据。您需要根据数据大小计算缓存未命中的可能性,并将其用作计算整体算法的 O 性能的一个因素。例如:

    如果缓存未命中的成本是 CM(我们假设它是常数),那么对于算法 A,整体缓存性能是 F(N)CM。如果缓存性能是算法 A 的主要循环中的一个因素(O(log N) 部分),那么算法 A 的真正性能特征是 O( F(N)(log N))。对于算法 B,整体缓存性能将为 F(log N)*CM。如果在算法 B 的主导循环期间出现缓存未命中,则算法 B 的实际性能为 O(F(log N)*N)。只要能确定F(),就可以比较算法A和B。

    【讨论】:

    • 另外,您是如何获得 b(log N) 作为 A 表现的一部分的:Performance A = aN + b(log N) + c
    猜你喜欢
    • 2014-03-21
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多