2

在阅读了二进制文件对缓存冲突的影响之后,我花了一个下午的时间阅读处理器缓存。现在我希望将这些新知识应用到我的多线程程序的内存分配器中。但是,我还没有完全理解它。

我的印象是处理器喜欢2 的幂,所以我的分配器轮次请求大小到下一个 2 的幂,然后将页面切成这个大小的倍数并分发出去。当页面已满时,它只是映射一个新页面并以相同的方式对其进行切片。这导致页面中非常相似且可预测的偏移量。

我应该在多大程度上调整我的分配器以避免这个问题?例如,我应该尝试稍微随机化地址,还是我一开始就因为使用 2 的幂而被搞砸了?

谢谢!

4

1 回答 1

0

在您有无可争议的证据证明对性能至关重要之前,请不要理会它。额外的并发症很可能不值得。

每个人都应该阅读(并理解!)Bentley 的“编写高效程序”(遗憾的是现在绝版了,他的“编程珍珠”包含一个摘要,也非常值得一读)。

  • 在开始代码优化之前,请确保它是值得的。如果性能足够,您的时间会得到更好的利用。是的,你必须先测量。
  • 衡量花费在哪里。众所周知,程序员不善于猜测成本在哪里
  • 最大的性能提升来自重述问题(有时它足以解决更快解决的问题),然后是系统的整体组织,下一个更好的算法/数据结构;并且在最后的细节优化,就像这里考虑的那样。
  • 你友好的编译器,如果在“生成好的代码”方向上稍加推动,今天在给定类似的(全功能规模)任务时,将生成经验丰富的汇编语言程序员更好的代码。大多数“为了性能”的本地源代码重组要么没有实际意义(编译器自己会这样做)要么有害(编译器将识别并重写通常的代码序列,不寻常的代码可能会使其无所事事或生成错误的代码) .
  • 除了极不寻常的情况外,程序员的时间(编写、调试、维护)比几微秒的计算机时间更有价值。编写最简单的代码来完成这项工作,只有在经验表明它有价值时才重新工作。
于 2013-02-16T21:39:08.320 回答