2次幂数据的性能优势?

时间:2012-03-01 11:38:15

标签: c arrays performance memory-management

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

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

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

5 个答案:

答案 0 :(得分:20)

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

然而,对于两个大小的数据,存在 暗侧 。它会在你最不期望的时候打动你。

请参阅以下两个问题/答案:

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

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

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


与所有表现问题一样,您需要衡量,衡量,衡量......并准备期待任何事情发生。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

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

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

使用大表会导致大量缓存未命中。因此,较小的表可能比较大的表更快,即使较大的表具有2的大小尺寸,也不会更小。

答案 3 :(得分:1)

两个人的力量在软件中被大量使用,因为它是计算机使用的数字基础。

例如,操作系统将以2的幂大小分配内存,处理器中的高速缓存大小为2的幂,地址大小为2的幂等等。

也可以优化使用两个值的幂的运算 - 乘法或除法变为简单的位移。

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

答案 4 :(得分:0)

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

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