64位程序比32位版本更大更快吗?
我想我是专注于x86,但我一般感兴趣的是从32位到64位。
从逻辑上讲,我可以看到常量和指针在某些情况下会更大,所以程序可能会更大。 而为了效率而分配字边界的内存意味着分配之间会有更多的空白。
我也听说x86上的32位模式必须在由于可能的4G地址空间重叠而发生上下文切换时刷新其caching。
那么,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指针。 对于一些testing,它会比32b或64b更小的代码和更快的执行速度。
https://sites.google.com/site/x32abi/
除非你需要访问32b寻址可以让你更多的内存,否则好处将会很小。
在64b CPU上运行时,无论运行32b或64b代码(使用相同的caching和相同的总线),都可以获得相同的内存接口。
虽然x64体系结构中有更多的寄存器允许更容易的优化,但是这通常会被指针所抵消,而指针现在变得更大,并且使用带指针的任何结构都会导致更高的内存stream量。 我估计一个64b应用程序的整体内存使用量增加了,而32b的应用程序增加了大约15-30%。
与x86相比,x86-64上的计算密集型代码的速度通常会提高30%。 这很可能是由于我们有16 x 64位通用寄存器和16 x SSE寄存器,而不是8 x 32位通用寄存器和8 x SSE寄存器。 这是在x86-64 Linux上的Intel ICC编译器(11.1) – 其他编译器(例如gcc)或其他操作系统(例如Windows)的结果可能会有所不同。
无论如何,我build议您始终编译系统默认字大小(32位或64位)的程序,因为如果将库编译为32位二进制文件并将其提供给64位系统,当64位版本是默认可用时,您将强制任何想要链接库的人提供他们的库(以及任何其他库依赖项)作为32位二进制文件。 这对每个人来说都是相当麻烦的。 如有疑问,请提供您的图书馆的两个版本。
至于64位的实际好处…最明显的是你得到一个更大的地址空间,所以如果mmap文件,你可以一次处理更多的(并加载更大的文件到内存)。 另一个好处是,假设编译器在优化方面做得很好,许多算术运算可以并行化(例如,在两个寄存器中放置两对32位数字,并在单个添加操作中执行两个加法),并且大数字计算将运行得更快。 也就是说,整个64位和32位的东西根本不会帮助你渐进的复杂性,所以如果你想优化你的代码,你应该看看algorithm,而不是像这样的常量因素。
编辑 :
请忽略我关于并行加法的陈述。 这不是由一个普通的添加语句执行…我很困惑,一些向量化/ SSE指令。 除了更大的地址空间之外,更准确的好处是有更多的通用寄存器,这意味着更多的本地variables可以保存在CPU寄存器文件中,访问速度要比将variables放在程序堆栈(通常意味着去L1caching)。
除了具有更多的寄存器之外,默认情况下64位具有SSE2。 这意味着你确实可以同时进行一些计算。 上证所扩展也有其他的好处。 但我想主要的好处是不必检查扩展的存在。 如果它是x64,它有SSE2可用。 …如果我的记忆正确地为我服务。
在x68到x68_64的具体情况下,64位程序将大致相同,如果不是稍微小一些,则使用更多的内存,并且运行得更快。 大多数情况下,这是因为x86_64不只有64位寄存器,它也是它的两倍。 x86没有足够的寄存器来使编译语言尽可能高效,所以x86代码花费了大量的指令和内存带宽在寄存器和内存之间来回移动数据。 x86_64的数量less得多,所以占用空间less一些,运行速度也快一些。 在x86_64中,浮点和位扭转vector指令也更有效率。
一般来说,64位代码不一定更快,并且通常更大,无论是在运行时代码和内存使用情况。
只有将应用程序移动到64位的理由是,需要在大型数据库或ERP应用程序中使用更多的内存,并且至less有100个并发用户,当应用程序caching更好的性能时,2 GB的限制将会相当快地被超过。 特别是在Windows操作系统上,整数和长度仍然是32位(它们有新的variables_int64,只有指针是64位),事实上WOW64在Windows x64上进行了高度优化,使得32位应用程序在64位Windows OS在Windows x64上我的经验是32位应用程序版本运行速度比64位快10-15%,因为在前一种情况下,至less对于专有内存数据库,可以使用指针算术来维护B-树(数据库系统中处理器最密集的部分)计算密集型应用程序需要大量的小数以达到最高的精度而不是在32-64位操作系统上双倍提供这些应用程序可以使用_int64而不是软件模拟,当然大型的基于磁盘的数据库也会显示改进超过32位能够使用大内存来caching查询计划等等。
任何需要CPU使用的应用程序,例如转码,显示性能和媒体渲染,无论是audio还是video,肯定都需要(在这一点上),并受益于使用64位与32位,因为CPU有能力处理纯粹的正在抛出的数据量。 这不是地址空间问题,而是数据处理的方式。 给定64位代码的64位处理器性能会更好,特别是在数据转换和VoIP数据等math上困难的情况下,事实上,任何types的“math”应用都将受益于64位CPU和操作系统的使用。 certificate我是错的。
更多的数据在CPU和RAM之间传输(64位而不是32位),所以64位程序在写入时可以更快一些,以便正确利用这些数据。