Wikipedia:



我正在对绳索和绳子进行某种折衷。基本上,这只是绳索,只是当串联字符串较短时,我会将串联对象展平为字符串。这有几个原因:

  • 当串联的字符串较短时(串联两个字符串以其正常形式花费的时间不长),串联对象的好处很小。
  • 这样做可以减少树的大/深(减少绳索的缺点)。
  • 这样做会增加叶节点的大小(以更好地利用缓存)。

  • 但是,随着长度的增加,绳索的优点也会减少,因此我想寻求一些折衷方案。从逻辑上讲,“最佳点”似乎位于“叶节点足够大以受益于缓存效应”的位置。问题是,我不知道那有多大。

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

    我的目标语言是C++。

    最佳答案

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

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

    10-06 07:05