2次幂数据的性能优势?

如果我有一个拥有3D世界的游戏,并且世界相当大,那么需要分成几个块,是否有一个主要的,如果有的话,有128个字节块的性能优势,比如150个字节的块? 显然,块中的对象仍然是整数个字节。

chunks[128][128][128]chunks[150][150][150]chunks[112][112][112]更快? 之后是否存在其他副作用,例如过多的RAM浪费? 是否还有其他因素需要考虑?

我只是看到将所有内容存储在变量和大小为2的幂的数组中是一种惯例,但我不确定它是否有任何优点,如果使用更多人类数字如100或150更好。

其他答案确实是正确的,两倍大小的数据将受益于使用乘法移位。

然而 ,两个大小的数据有一个黑暗的一面 。 它可以在你最不期望的时候击中你。

看到这两个问题/答案:

  • 矩阵乘法:矩阵大小差异小,时序差异大
  • 为什么在单独的循环中元素添加比在组合循环中快得多?

当您的数据集是2的幂时,它们更有可能在内存中超对齐。 (意思是他们的地址可能在两个大的幂上具有相同的模数。)

虽然这似乎是可取的,但它们可能导致:

  • 冲突缓存未命中
  • 错误的别名停顿(在上面的第二个链接中提到)

如果您阅读了与上述相关的两个问题,您可以看到对齐可能导致减速超过3倍 – 这可能远远超过使用轮class而不是乘法所获得的任何好处。


因此,对于所有性能问题,您需要测量,测量,测量……并准备好期待任何事情发生。

你提到你代表的是一个3D空间 – 这正是那种展现出两次跨步内存访问可能导致速度减慢的情况。

它并不完全“更快”,而是更好地利用可用内存,因为硬件和操作系统以大小最有可能为2的单位来管理内存。 由于对齐要求,分配小于2的幂的东西通常会导致浪费内存。

如果您深入研究分配器和操作系统内存管理器,您将看到它们以两种功率管理所有内容。 OS通常以页面的forms管理进程的内存,现在页面大小通常为4096字节。 因此,如果要分配4000字节的片段,操作系统仍将分配4096个字节,剩余的96个字节将被浪费。

如果您通过以下方式访问数据:

 chunks[150][150][150] chucks[x][y][z] = 123; 

然后处理器必须进行乘法运算(例如:z + 150 *(y + 150 * x)…)以获取地址。

如果使用2次幂幂,那么编译器可以进行一些优化,并使用移位而不是乘法。 新的CPU使得乘法非常快,因此效果微不足道。

使用大表可能会导致很多缓存丢失。 因此,较小的表可能比较大的表更快,即使更大的表具有2个尺寸的尺寸,而不是更小。

两个版本的function在软件中经常使用,因为它是计算机使用的数字基础。

例如,OS将以2的幂的块大小分配存储器,处理器中的高速缓存大小是2的幂,地址大小是2的幂,依此类推。

使用两个值的幂的操作也可以被优化 – 乘法或除法变为简单的位移。

基本上确保一切都使用2的幂可能会提高软件的性能,但通常编译器和/或操作系统将确保在使用任意大小时以有效的方式利用数据。

它可能更快,可能更慢,可能是相同的速度。 仅仅通过查看代码就很难给出正确的答案。 所以答案是:测量它,更改代码,再次测量它。 如果您的代码必须在不同的计算机上运行,​​请在每个计算机上进

我倾向于认为二次幂对齐通常会引发严重的问题,并且使用比所需更多的内存对性能没有帮助。 使用适合某些缓存的一小部分内存进行大量操作,然后切换到下一部分内存,通常会有所帮助。 访问连续的内存地址通常会有所帮助。 向上舍入以便您可以使用向量操作通常会有所帮助。