代码之家  ›  专栏  ›  技术社区  ›  Imagist

绳索:什么是“大到可以从缓存效果中获益”?

  •  2
  • Imagist  · 技术社区  · 16 年前

    Wikipedia :

    主要缺点更大 整体空间使用率低 索引,两者都变得越来越多 随着树木结构的恶化 越大越深。然而,许多 索引的实际应用 只涉及迭代 字符串,只要 叶节点大到足以 从缓存效果中获益。

    我在绳子和绳子之间进行一种妥协。基本上,它只是一条绳子,只是当连接的字符串很短时,我将连接对象展平为字符串。这有几个原因:

    1. 当连接的字符串较短时,连接对象的好处是最小的(以正常形式连接两个字符串不需要太长的时间)。
    2. 这样做可以减少树的大面积/深度(减少绳子的缺点)。
    3. 这样做会增加叶节点的大小(以更好地利用缓存)。

    但是,随着长度的增加, 优势 绳子的数量也减少了,所以我想找到一些折衷办法。逻辑上,“最佳位置”似乎就在“叶节点足够大,可以从缓存效果中获益”附近。问题是,我不知道它有多大。

    编辑:当我写这篇文章时,我突然想到理想的大小应该是缓存页的大小,因为当缓存页在字符串中出现时,绳子只会导致缓存未命中。所以我的第二个问题是,这个推理是正确的吗?有没有跨平台的方法来检测缓存页面的大小?

    我的目标语言是C++。

    1 回复  |  直到 16 年前
        1
  •  3
  •   MSalters    16 年前

    类似绳子的极限情况将建立在 std::list<char> . 这显然不是很有效。迭代时,每个“leaf”/字符可能有一个缓存未命中。当每个叶的字符数增加时,平均未命中数就会下降,一旦叶分配超过单个缓存线,就会出现中断。

    拥有更大的leaf仍然是一个好主意;缓存层次结构中的内存传输可能在不同的级别具有不同的粒度。此外,当针对一组混合CPU(即消费PC)时,叶大小(2的更大功率)将是更多计算机上缓存线大小的整数倍。例如,如果使用16和32字节的缓存线寻址CPU,32字节将是更好的选择,因为它总是缓存线的整数。浪费一半缓存线是一种耻辱。

    推荐文章