为什么有的程序在64位机上跑反而比32位机更慢

最近工作遇到了一个问题,原本在32位Android机上跑的好好的程序,在某些64位机上却变慢了许多。感觉很奇怪,所以google了一下原因,网上给出的原因大部分是过多使用指针。可是为什么过多使用指针就会造成程序变慢呢?结合网上的资料,和自己的理解,我认为是如下原因造成的:

(1)因为64位比32位的指针大了一倍,寻址空间从2^32大幅上升到2^64,但是这也带来了额外的问题。一个指针的存储空间也变成了原来的两倍,在做指针运算时,例如int*ptr,*(ptr+5),移动距离也变为了原来的两倍。

(2)如果cpu的缓存大小不变,假设为10k=1024*10byte。原来一个指针只占用4byte,缓存中能存储2560个指针。现在由于指针占用空间变大,只能存储1280个了。

(3)假设程序中需要读取某个指针的数据,可以简单分为两种情况:如果该数据在缓存中,那么直接做指针取数据运算;如果该数据不在缓存中,程序就需要从内存中寻找数据并更新缓存(这部分机制不是特别熟悉,姑且这么理解吧……)。

(4)在上述情况下,如果程序中对内存的访问经常“跳跃”的话(例如不是i++,而是i+=10),考虑到64位机的指针长度变成了32位机的两倍,那么移动时会比之前慢一些。更严重的是,程序还会更频繁的在缓存中寻找数据失败,导致从内存寻找数据并更新缓存,这样读取数据操作的耗时就会提高,程序的运行速度也会显著下降。

综上所述,如果某个android机厂商为了偷工减料,把cpu升级成64位后,缓存容量却不升级,而恰好你的程序中又有很多不连续的指针运算,那么程序的运行速度就会变慢很多(我们这边的程序运行速度变慢了50%)。另一方面,如果某个android机厂商比较有良心的话,把cpu升级成64位后,缓存容量也跟着升级了,那么程序变慢的现象就基本不会出现。以上两种情况,我在不同厂商的手机上都遇到过,就不点名了。对于Android开发者,尤其是做NDK开发的,还是需要多考虑内存使用方面的优化,如果有频繁的内存申请/释放,最好还是利用内存池等技术避免。

参考资料:

【1】http://www.quora.com/I-came-to-know-that-a-64-bit-architecture-machine-working-with-a-64-bit-OS-works-10-15-slower-than-a-32-bit-OS-working-on-the-same-machine-Why-is-that

【2】http://android-developers.blogspot.com/2015/07/game-performance-data-oriented.html

时间: 2024-10-11 06:48:45

为什么有的程序在64位机上跑反而比32位机更慢的相关文章

呃,如何使 .NET 程序,在 64位 系统 中,以 32位 模式运行。

其实最简单的方法就是在解决方案中,把平台设为 x86 就好了哈~   但是今天遇到一个第三方的软件,它调用的一个 dll 是 32位 的,可能它没有测试过在 64位 系统下运行的情况,它在编译时是按默认的配置设为了 Any CPU. 但是在 64位 系统中以默认 64位 模式运行时,再调用 32位 的 dll 就报异常了... 于是想到的一个办法就是让它在 64位 系统中,以 32位 模式运行就好了~   在网上搜了一下,没想到 .NET 本身就提供了这个修改工具,叫做 CorFlags.exe

64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多

前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操作系统只是硬件和应用软件中间的一个平台.我们的CPU从原来的8位,16位,到现在的32位和64位. 背景: 电脑的内存是8GB, 装的是32位的Win 7 32位版本,系统认出的内存是3.5GB, 应该说是4GB,因为还有0.5GB内存分配给了显存. 笔者十分痛苦,花重金购置的骇客神条单条8GB竟然

在64位主机上编译产生32位的目标代码

   今天又看CS630[1]的Chapter 15,发现里头的一个例程manydots.s无法正常编译. $ gcc manydots.s -o manydots /tmp/ccIvmRVT.o: In function `_start': (.text+0x0): multiple definition of `_start' /usr/lib/gcc/x86_64-linux-gnu/4.3.1/../../../../lib/crt1.o:(.text+0x0): first defin

64位读取注册表与32位的区别

有一个读取注册表信息的程序  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkeystring , 0, KEY_READ, &hKey) == ERROR_SUCCESS)/ ,在32位下完全正常,但是在64位返回值正确,但就是读不到东西.后来单步发现读不到东西,就搜64位读注册表失败,发现需要加 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkeystring , 0,KEY_READ|KEY_WOW64_64KEY, &am

Linux判断CPU是32位还是64位,判断系统是32位还是64位

from:http://www.ipcpu.com/2010/08/linux-cpu-32-64/ 本文仅限于服务器CPU和Linux系统讨论,与台式电脑.笔记本无关. 32位.64位不能乱装,64的能装32位的,因为64位的CPU可以兼容32位,32位的装不了64位的.最近部署了MongoDB,系统是32位的提示会有最大文件2G的限制.还有最常见的问题32位系统不支持4G以上内存,即使打PAE效率也受影响. 1.判断CPU是32位还是64位 这个问题比较有意思,网上给出的办法都是判断了系统的

不能安装64位office提示已安装32位如何处理

不能安装64位office提示已安装32位如何处理? 1 2 3 4 5 6 当你遇到提示说[无法安装64位版本的office,以为在您的PC上找一下32位程序......]时如果你还想安装64位的office该怎么弄呢? 方法/步骤 首先当你装64位的office的时候会提示如下的弹窗   按“win+R”快捷键,打开“运行”,输入“regedit”,敲回车键. 操作显示如下图:   打开注册表编辑器之后,找到[HKEY_CLASSES_ROOT]点开   在[HKEY_CLASSES_ROO

debian 64位系统中添加对32位的支持

dpkg --add-architecture i386 apt-get update apt-get install ia32-libs debian 64位系统中添加对32位的支持,布布扣,bubuko.com

Win7 64位系统上配置使用32位的Eclipse(转)

Win7 64位系统上配置使用32位的Eclipse 博客分类: Eclipse eclipse 最近工作电脑换成了64位的win7系统,之前个人电脑上安装的jdk和Eclipse都是32位的.而新的工作电脑上安装的JDK是64位的,因 为原来的Eclipse自己安装了很多的插件和个性化配置,不想重新安装64位的Eclipse,所以想在64位的win7系统上继续使用原来的32位 Eclipse. 32位的Eclipse无法和64位的jdk搭配使用,但是我又不想仅仅为了适配Eclipse而只安装3

16位的MD5加密和32位MD5加密的区别

16位的MD5加密和32位MD5加密的区别 MD5加密后所得到的通常是32位的编码,而在不少地方会用到16位的编码它们有什么区别呢?16位加密就是从32位MD5散列中把中间16位提取出来!其实破解16位MD5散列要比破解32位MD5散列还慢因为他多了一个步骤,就是使用32位加密后再把中间16位提取出来, 然后再进行对比而破解32位的则不需要,加密后直接对比就可以了 admin 的加密代码:16位加密:7a57a5a743894a0e32位加密:21232f297a57a5a743894a0e4a