在x86-64上,32位应用程序比64位应用程序有性能优势吗



我知道64位比32位的优势,但除了兼容性之外,32位应用程序比64位应用程序有什么优势可以让32位应用更快或更高效吗?

有一个很大的优势:32位应用程序使用的内存明显更少(正是因为指针更小(。并不是所有的东西都是指针,例如字符串和数字不会改变它们的大小,所以有效差不是2倍。我碰巧特别了解JavaScript引擎,64位版本在相同的工作负载下通常比32位版本的相同引擎多使用大约50%的内存。

V8最近通过实现";指针压缩";在其64位版本中。理论上,任何C/C++应用程序都可以做同样的事情,但这是一项巨大的工程工作。

也就是说,这通常不是不迁移到64位的原因,因为其他好处(更多的寄存器,更多的地址空间(通常会超过这个缺点。但这确实意味着,如果你的目标设备/机器的内存低于4GiB,那么如果内存消耗是一个问题,你可能会坚持使用32位构建。

(根据我的经验,性能好坏参半:较小的代码和较小的数据意味着32位上更好的缓存利用率;OTOH在64位上拥有更多更宽的寄存器可以将指令保存在那里。在极少数的极端情况下,64位应用程序可以在同一时间处理两倍多的数据;大多数情况下,差异仅在1-5%之间,并且可以朝任何一个方向发展:有时a 32-位构建确实比64位构建快一点;这实际上取决于应用程序在做什么。(

简而言之,不是。更准确地说,理论上可能是某些处理器的情况,但我不知道。

我脑海中唯一的其他区别是,32位指令通常较小(至少由于没有REX前缀(,因此您可以通过这种方式节省一些空间,但它可能不会超过x64的好处。考虑到x64特有的指令也往往具有更高的影响,即一次处理更多的数据,代码在x64中甚至可能更紧凑。出于同样的原因,x32通常较慢。所以,不,x32与x64相比,除了兼容性之外,没有任何真正的优势。

对于windows应用程序,32位被视为"最便携的";(更容易分发(尽管这已经不再是一个问题了。

对于Ruby这样的内存占用者,在我看来它使用了1/2的RAM,所以你可以在RAM有限的盒子上运行更多的应用程序。更不用说";所有应用程序";使用更少的RAM(内核等(

它的运行速度也更快,因为它遍历所有内存来进行垃圾收集,这更适合缓存,需要遍历的整体RAM更少,寻找指针等等。同时,当GC寻找指针时,64位不太可能发现误报,所以64位在这方面的小胜利。

如果你真的很勇敢,你可以尝试混合x32 ABI(32位指针,64位寄存器(https://unix.stackexchange.com/questions/121424/linux-and-x32-abi-how-to-use这意味着两全其美。我真的不知道为什么它不被认为是一个更受欢迎的选择,这对我来说似乎是一个不错的胜利,代价是你的RAM不能超过2GB。我的猜测是,大多数人并不是在一个RAM非常受限的环境中,或者说,对"直接"的胜利;32位内核";(这得到了很好的支持(动力不够吗?从本质上讲,大多数盒子都有大量的RAM,所以这不是一个优先事项吗?

最新更新