从Wikipedia:
我正在对绳索和绳子进行某种折衷。基本上,这只是绳索,只是当串联字符串较短时,我会将串联对象展平为字符串。这有几个原因:
但是,随着长度的增加,绳索的优点也会减少,因此我想寻求一些折衷方案。从逻辑上讲,“最佳点”似乎位于“叶节点足够大以受益于缓存效应”的位置。问题是,我不知道那有多大。
编辑:当我写这篇文章的时候,我想到理想的大小应该是缓存页面的大小,因为那样的话,当字符串无论如何都会发生时,绳索只会导致缓存未命中。所以我的第二个问题是,这种推理正确吗?有没有一种跨平台的方法来检测缓存页面的大小?
我的目标语言是C++。
最佳答案
绳状弦的极限情况将建立在std::list<char>
之上。那显然不是很有效。迭代时,每个“叶子” /字符有一个缓存未命中的可能。随着每片叶子的字符数增加,平均未命中次数下降,一旦叶子分配超过单个缓存行,就会中断。
有较大的叶子可能仍然是一个好主意。高速缓存层次结构中的内存传输在不同级别可能具有不同的粒度。同样,当以一组混合的CPU(即消费类PC)为目标时,叶子大小(是2的较高幂)将是更多机器上缓存行大小的整数倍。例如。如果要使用16和32字节高速缓存行来寻址CPU,则32字节将是更好的选择,因为它总是高速缓存行的整数。浪费一半的缓存行是一个耻辱。