问题描述
- 64位,32位windows上的相同程序,运行效率到底区别有多大?
- 64位,32位windows上的相同程序,运行效率到底区别有多大?
分别在对应的版本下编译并运行。
解决方案
看什么样的程序。如果是科学计算程序,比如用到很多64位的四则运算,那么显然32位机器要想做同样的工作,需要3、4倍的指令才能完成,那么64位的优势是明显的。
可以举一个例子。你可以运行Windows XP和Windows XP x64版本下的计算器(calc.exe),执行高级运算中的阶乘。计算一个比较大的数,比如10万。你可以看到两者花费时间惊人的不同。
但是对于一般的办公软件、游戏软件,增加位宽无助于提高性能,事实上32位都显得多余,只有它的最低几位在参与实际的运算。那么64位其实和32位差别不大。
事实上,32bit的系统性能还没有那么弱,因为在32bit系统上,处理器早就扩展了iSSE/iSSE2指令,它们已经将浮点和整数的计算位宽大大扩大了。
所以64位主要还是针对4GB以上内存寻址而不得不采用的技术。
解决方案二:
再举一个通俗的例子,你可以想象有两个算盘,一个是只有4排的,一个有8排的。如果你要计算的东西都是1000以内的加减法,那么两个算盘一样用,毫无区别。
但是如果你要计算几万几万(并且不能省略小数)的,那么4排算盘不够了,你只能算好低位,记录下结果,再算高位,最后把两次计算结果合并输出。那么8排的算盘就强多了。
解决方案三:
当然,实际上,64位和32位还是有些不同的。这主要体现在64位下,对应每条指令和每个数据,需要的存储都比32位大。因此,一块1MB L2缓存的CPU,运行64位程序,相当于它的缓存就减半了。
一个2GB内存的计算机,运行64bit程序,也相当于减半了内存。不但这样,总线传输数据效率也减半了。
从这个意义上来说,x64系统似乎效率更差。
但是实际上这个事情比较复杂,Intel/AMD预计到了这种情况,于是在指令编码和地址编码上做了优化。比如说用压缩的格式表示指令;56位以上的地址事实上被忽略(事实上现在的x64寻址能力不是2^64字节,而是2^56甚至更少)等等。
这些措施使得x64因为存储造成的性能损失被控制在最小。同时64位驱动程序、指令等等又产生了一些性能增量,总体来看,x64和x86相比,性能还有微小提高,但是在非计算密集/数据密集的应用中,这种提高只有10%以内。
解决方案四:
64bit程序的地址空间更大,64位,比32bit程序地址空间大很多,可以提高计算数据带宽