64位程序比32位版本更大更快吗?

时间:2010-03-04 10:20:04

标签: performance 64-bit 32-bit 128-bit

我想我专注于x86,但我通常对32位到64位的移动感兴趣。

逻辑上,我可以看到常量和指针在某些情况下会更大,因此程序可能会更大。为了提高效率而在字边界上分配内存的愿望意味着分配之间会有更多的空白。

我还听说x86上的32位模式必须在上下文切换时刷新其缓存,因为可能存在重叠的4G地址空间。

那么,64位的真正好处是什么?

作为一个补充问题,128位会更好吗?

编辑:

我刚刚编写了我的第一个32/64位程序。它生成16字节(32b版本)或32字节(64b版本)对象的链表/树,并对stderr进行大量打印 - 不是一个非常有用的程序,而不是典型的,但它是我的第一个。

大小:81128(32b)v 83672(64b) - 所以差别不大

速度:17s(32b)v 24s(64b) - 在32位操作系统(OS-X 10.5.8)上运行

更新

我注意到正在开发一种新的混合x32 ABI(应用程序二进制接口),它是64b但使用32b指针。对于某些测试,它导致比32b或64b更小的代码和更快的执行。

https://sites.google.com/site/x32abi/

9 个答案:

答案 0 :(得分:40)

与x86相比,我通常认为x86-64上的计算密集型代码的速度提高了30%。这很可能是因为我们有16 x 64位通用寄存器和16 x SSE寄存器,而不是8 x 32位通用寄存器和8 x SSE寄存器。这是在x86-64 Linux上的英特尔ICC编译器(11.1) - 与其他编译器(例如gcc)或其他操作系统(例如Windows)的结果当然可能不同。

答案 1 :(得分:28)

除非你需要访问32b寻址所允许的更多内存,否则其好处将很小(如果有的话)。

当在64b CPU上运行时,无论您运行的是32b还是64b代码(使用相同的缓存和相同的总线),都可以获得相同的内存接口。

虽然x64架构还有一些寄存器允许更容易的优化,但这通常会被指针现在更大并且使用带指针的任何结构导致更高内存流量的事实所抵消。我估计64b应用程序的总内存使用量增加,而32b应用程序的总内存使用量增加约为15-30%。

答案 2 :(得分:15)

无论有什么好处,我建议您始终为系统的默认字大小(32位或64位)编译程序,因为如果您将库编译为32位二进制文​​件并在在64位系统中,当64位版本是默认可用时,您将强制任何想要与您的库链接的人提供他们的库(以及任何其他库依赖项)作为32位二进制文​​件。这对每个人来说都是非常麻烦的。如有疑问,请提供您图书馆的两个版本。

至于64位的实际好处......最明显的是你获得了更大的地址空间,所以如果mmap是一个文件,你可以一次解决更多的问题(并将更大的文件加载到内存中)。另一个好处是,假设编译器在优化方面做得很好,许多算术运算都可以并行化(例如,将两对32位数放在两个寄存器中,并在单个加法运算中执行两次加法),并且数字计算将更快地运行。也就是说,整个64位与32位的东西根本无法帮助你渐进复杂,所以如果你想优化代码,你应该看看算法而不是像这样的常数因素。

修改的:
请忽略我关于并行添加的声明。这不是由普通的add语句执行的...我对一些矢量化/ SSE指令感到困惑。除了更大的地址空间之外,更准确的好处是有更多的通用寄存器,这意味着可以在CPU寄存器文件中维护更多的局部变量,这比将变量放入的更快。程序堆栈(通常意味着转出L1缓存)。

答案 3 :(得分:4)

除了拥有更多寄存器外,64位默认具有SSE2。这意味着您确实可以并行执行某些计算。 SSE扩展也有其他好处。但我想主要的好处是不必检查扩展的存在。如果它是x64,它有SSE2可用。 ......如果我的记忆能正确地为我服务。

答案 4 :(得分:3)

只有将应用程序迁移到64位的理由才需要在大型数据库或ERP应用程序等应用程序中拥有更多内存,并且至少有100个并发用户,当应用程序缓存以获得更好的性能时,将会相当快地超过2 GB的限制。这种情况特别适用于Windows操作系统,其中整数和长整数仍然是32位(它们有新变量_int64。只有指针是64位。实际上WOW64在Windows x64上进行了高度优化,因此32位应用程序在64位Windows上运行时受到低惩罚操作系统。我在Windows x64上的经验是32位应用程序版本比64位快10-15%,因为在前一种情况下,至少对于专有内存数据库,您可以使用指针算术来维护b-tree(数据库系统的大多数处理器密集型部分) 。计算密集型应用程序需要大小数才能获得最高精度,而不是32-64位操作系统上的双精度。这些应用程序可以原生使用_int64而不是软件仿真。当然,基于大型磁盘的数据库也会显示超过32位的改进。能够使用大内存来缓存查询计划等。

答案 5 :(得分:1)

每次内存提取(64位而不是32位)在CPU和RAM之间传输更多数据,因此64位程序在写入时可以更快,以便他们正确利用这一点。

答案 6 :(得分:1)

在x68到x68_64的特定情况下,64位程序的大小大致相同,如果不是稍微小一些,则使用更多的内存,并且运行速度更快。这主要是因为x86_64不仅有64位寄存器,而且还有两倍的寄存器。 x86没有足够的寄存器来使编译语言尽可能高效,因此x86代码会花费大量指令和内存带宽在寄存器和内存之间来回移位数据。 x86_64的功能要少得多,因此占用的空间更少,运行速度也更快。浮点和位扭曲向量指令在x86_64中也更有效。

一般而言,64位代码不一定更快,并且通常更大,无论是在运行时代码和内存使用情况。

答案 7 :(得分:1)

我正在编码一个象棋引擎。在Win32配置上,使用基于minimax的树搜索到深度9(从某个位置)进行的最佳移动提取大约需要17.0s,而切换到x64后现在大约需要10.3s。这是41%的加速度!

答案 8 :(得分:0)

任何需要CPU使用的应用程序,例如转码,显示性能和媒体渲染,无论是音频还是视觉,肯定都需要(此时),并且由于CPU和使用64位而不是32位而受益。能够处理被抛出的大量数据。它不是地址空间的问题,而是处理数据的方式。给定64位代码的64位处理器将会表现得更好,特别是在转码和VoIP数据等数学上很困难的事情 - 事实上,任何类型的数学处理器都是如此。应用程序应该受益于64位CPU和操作系统的使用。证明我错了。