如果我有一个拥有3D世界的游戏,并且世界相当大,那么需要分成块,是否有一个主要的,如果有的话,有128字节块的性能优势,比如150字节的块?显然,块中的对象仍然是整数个字节。
即。 chunks[128][128][128]
比chunks[150][150][150]
还是chunks[112][112][112]
更快?{1}}?之后是否存在其他副作用,例如过多的RAM浪费?还有其他因素需要考虑吗?
我只是看到将所有内容存储在变量和大小为2的幂数组中是一种约定,但我不确定它是否有任何优点,如果使用更多的人类数字可能会更好100或150。
答案 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)
它可能更快,可能更慢,可能是相同的速度。仅仅通过查看代码就很难给出正确的答案。所以答案是:测量它,改变代码,再次测量它。如果您的代码必须在不同的计算机上运行,请在每个计算机上进
我倾向于认为二次幂对齐经常会遇到严重的麻烦,并且使用比所需更多的内存对性能没有帮助。使用适合某些缓存的一小部分内存进行大量操作,然后切换到下一部分内存,通常会有所帮助。访问连续的内存地址通常会有所帮助。向上舍入以便您可以使用向量操作通常会有所帮助。