如果我有一个有3D世界的游戏,世界很大,所以需要被分成块,那么有128字节的块,比如说150字节的块,有没有主要的性能优势?显然,块中的对象大小仍然是整数个字节。
也就是说,chunks[128][128][128]比chunks[150][150][150]或chunks[112][112][112]快吗?之后是否有其他副作用,如过多的RAM浪费?是否还有其他因素需要考虑?
我只是看到,将所有内容存储在2的幂大小的变量和数组中是一种惯例,但我不确定这样做是否有任何优点,以及使用更多的人类数字是否会更好,比如100或150。
发布于 2012-03-07 14:56:58
其他答案确实是正确的,即2的幂大小的数据将受益于使用移位乘法。
然而,有一个暗面到2的幂大小的数据。它会在你最意想不到的时候袭击你。
查看以下两个问题/答案:
当您的数据集是2的幂时,它们在内存中更有可能是超级对齐的。(这意味着它们的地址很可能在2的大幂上具有相同的模数。)
虽然这似乎是可取的,但它们可以导致:
如果你阅读上面链接的两个问题,你可以看到对齐可以导致超过3倍的减慢-这可能远远超过你从使用移位而不是乘法中获得的任何好处。
因此,对于所有的性能问题,您需要测量,测量,测量...做好准备,准备好迎接任何事情的发生。
您提到您代表的是一个3D空间--这正是一种可能导致速度减慢的2次方跨步内存访问的情况。
发布于 2012-03-01 19:48:06
它并不是很“快”,而是更好地利用了可用内存,因为硬件和操作系统管理内存的单元大小很可能是2的幂。分配小于2的幂的东西通常会因为对齐要求而导致内存浪费。
如果您深入研究分配器和OS内存管理器,您将看到它们以2的幂大小管理一切。操作系统通常按页来管理进程的内存,现在页大小通常为4096字节。所以如果你想分配一个4000字节的块,操作系统仍然会分配4096个字节,剩下的96个字节会被浪费掉。
发布于 2012-03-01 20:05:39
如果您通过以下方式访问数据:
chunks[150][150][150]
chucks[x][y][z] = 123;然后处理器必须做乘法运算(例如:z+ 150 * (y + 150 * x) ... )为了得到一个地址。
如果你使用2的幂常数,那么编译器可以做一些优化,并使用移位而不是乘法。新的CPU使得乘法非常快,所以影响不大。
使用大表可能会导致大量缓存未命中。所以更小的表可能比更大的表更快,即使更大的表也有2的幂大小的维度,而更小的表则不是。
https://stackoverflow.com/questions/9515482
复制相似问题