【发布时间】:2021-12-19 11:39:08
【问题描述】:
我知道 64 位相对于 32 位的优势,但除了兼容性之外,32 位应用程序相对于 64 位应用程序是否有任何优势可以使 32 位应用程序更快或更高效?
【问题讨论】:
标签: performance x86 x86-64 32bit-64bit
我知道 64 位相对于 32 位的优势,但除了兼容性之外,32 位应用程序相对于 64 位应用程序是否有任何优势可以使 32 位应用程序更快或更高效?
【问题讨论】:
标签: performance x86 x86-64 32bit-64bit
简而言之,没有。更准确地说,理论上某些处理器可能是这种情况,但我不知道。
我想到的唯一其他区别是 32 位指令通常更小(至少由于没有 REX 前缀),因此您可以通过这种方式节省一些空间,但它可能不会超过x64 的好处。考虑到 x64 特有的指令也往往具有更高的影响,即一次处理更多数据,代码甚至可能在 x64 中变得更紧凑。而且,出于同样的原因,x32 通常更慢。所以不,除了兼容性之外,x32 与 x64 相比没有任何真正的优势。
【讨论】:
有一个很大的优势:32 位应用程序使用的内存要少得多(正是因为指针更小)。并非一切都是指针,例如字符串和数字不会改变它们的大小,因此有效差异不是 2 倍。我碰巧特别了解 JavaScript 引擎,对于相同的工作负载,64 位版本通常比同一引擎的 32 位版本多使用大约 50% 的内存。
V8 最近通过在其 64 位版本中实现“pointer compression”解决了这个问题。理论上,任何 C/C++ 应用程序都可以做同样的事情,但这是一项巨大的工程工作。
也就是说,这通常不是不迁移到 64 位的理由,因为其他好处(更多寄存器、更多地址空间)通常会超过这个缺点。但这确实意味着,如果您的目标是内存小于 4GiB 的设备/机器,您可能希望坚持使用 32 位构建,如果内存消耗是一个问题。
(根据我的经验,性能好坏参半:更小的代码和更小的数据意味着 32 位上的缓存利用率更高;OTOH 在 64 位上拥有更多和更宽的寄存器可以在那里节省指令。在极少数极端情况下,a 64 位应用程序可以同时处理两倍的数据;大多数情况下,差异只会在 1-5% 的范围内,并且可以朝任一方向发展:有时 32-位构建确实比 64 位构建快一点;这实际上取决于应用程序在做什么。)
【讨论】:
对于 Windows 应用程序,32 位被视为“最便携”(更易于分发),尽管这已不再是问题。
对于像 Ruby 这样的内存占用者,在我看来它使用了 1/2 的 RAM,因此您可以在 RAM 有限的机器上运行更多应用程序。更不用说“所有应用程序”使用更少的 RAM(内核等)
它的运行速度也更快,因为它遍历所有内存进行垃圾收集,这更适合缓存,需要遍历的整体 RAM 更少,寻找指针等。同时,64 位不太可能在 GC 寻找指针时发现误报,所以对于 64 位来说,胜利很小。
如果您真的很勇敢,您可以尝试混合 x32 ABI(32 位指针,64 位寄存器)https://unix.stackexchange.com/questions/121424/linux-and-x32-abi-how-to-use,它旨在实现两全其美。我真的不确定为什么它不被认为是更受欢迎的选择,这对我来说似乎是一个不错的胜利,权衡是你不能拥有超过 2GB 的 RAM。我的猜测是大多数人不是在一个非常受 RAM 限制的环境中,或者只是直接使用“32 位内核”(得到很好的支持)的胜利还不够动力?从本质上讲,大多数盒子都有大量 RAM,所以它不是那么重要?
【讨论】:
long long 是 64 位类型。可能结构布局规则有些不同,比如 alignof(long long) 和 alignof(double) 可能是 8 而不是 32 位模式的 4。