2

来自维基百科

主要缺点是更大的整体空间使用和更慢的索引,随着树结构变得更大和更深,这两者都变得更加严重。然而,索引的许多实际应用只涉及对字符串的迭代,只要叶节点足够大以受益于缓存效应,它就会保持快速。

我正在实现绳索和字符串之间的某种妥协。基本上它只是绳索,除了当连接的字符串很短时我将连接对象扁平化为字符串。这有几个原因:

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

但是,随着长度变长,绳索的优势也会降低,所以我想找到一些折衷方案。从逻辑上讲,“最佳位置”似乎在“叶节点大到足以从缓存效应中受益”的地方。问题是,我不知道它有多大。

编辑:当我写这篇文章时,我想到理想的大小应该是缓存页面的大小,因为绳索只会导致缓存未命中,因为它们无论如何都会在字符串中发生。所以我的第二个问题是,这个推理是否正确?是否有一种跨平台的方法来检测缓存页面的大小?

我的目标语言是 C++。

4

1 回答 1

3

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

拥有更大的叶子可能仍然是一个好主意。缓存层次结构中的内存传输可能在不同级别具有不同的粒度。此外,当针对混合的 CPU 集(即消费类 PC)时,叶大小是 2 的较高幂,将是更多机器上高速缓存行大小的整数倍。例如,如果您使用 16 和 32 字节缓存线来寻址 CPU,则 32 字节将是更好的选择,因为它始终是整数的缓存线。浪费半个缓存行是一种耻辱。

于 2009-08-24T07:55:30.310 回答