首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >2次幂大小数据的性能优势?

2次幂大小数据的性能优势?
EN

Stack Overflow用户
提问于 2012-03-01 19:38:15
回答 5查看 6K关注 0票数 20

如果我有一个有3D世界的游戏,世界很大,所以需要被分成块,那么有128字节的块,比如说150字节的块,有没有主要的性能优势?显然,块中的对象大小仍然是整数个字节。

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-07 14:56:58

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

然而,有一个暗面到2的幂大小的数据。它会在你最意想不到的时候袭击你。

查看以下两个问题/答案:

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

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

  • Conflict Cache Misses
  • False别名停顿(在上面的第二个链接中提到)

如果你阅读上面链接的两个问题,你可以看到对齐可以导致超过3倍的减慢-这可能远远超过你从使用移位而不是乘法中获得的任何好处。

因此,对于所有的性能问题,您需要测量,测量,测量...做好准备,准备好迎接任何事情的发生。

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

票数 22
EN

Stack Overflow用户

发布于 2012-03-01 19:48:06

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

如果您深入研究分配器和OS内存管理器,您将看到它们以2的幂大小管理一切。操作系统通常按页来管理进程的内存,现在页大小通常为4096字节。所以如果你想分配一个4000字节的块,操作系统仍然会分配4096个字节,剩下的96个字节会被浪费掉。

票数 3
EN

Stack Overflow用户

发布于 2012-03-01 20:05:39

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

代码语言:javascript
复制
chunks[150][150][150]
chucks[x][y][z] = 123;

然后处理器必须做乘法运算(例如:z+ 150 * (y + 150 * x) ... )为了得到一个地址。

如果你使用2的幂常数,那么编译器可以做一些优化,并使用移位而不是乘法。新的CPU使得乘法非常快,所以影响不大。

使用大表可能会导致大量缓存未命中。所以更小的表可能比更大的表更快,即使更大的表也有2的幂大小的维度,而更小的表则不是。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9515482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档