【32位程序和64位程序谁速度更快】
本帖最后由 书香 于 2024-2-26 20:22 编辑这是我们之前提出的一个问题
【32与64位程序的区别】
关于这个问题书香也与其他技术大佬们在各大群里爆发了几次激烈的争辩,最终书香的观点赢得了胜利,嘿嘿
主流的观点是:
①:64位的速度是32位的2倍
②:64位比32位快,但是不一定快2倍
③:64位和32位谁快不一定,分场景
④:书香及部分人的观点是32位一般情况都比64位速度要快
对于这个问题,前后可以说是爆发了激烈的争论,书香被喷的还是很惨的,不过最后能够赢下这场辩论赛并收获新知识,书香觉得很值得
在理论中,64位框架确实比32位框架要快一半,但是这是针对于CPU的运算规则来讲的,但是软件的快慢不是CPU说了算的,cpu并不起到绝对作用,也就是说,你运算很快,但是你先运算完又怎么样?你先等着我数据存储完毕才能进行下一条指令
①内存地址
我们写代码的时候会使用到变量存储数据,变量的数据是存储在内存条里面的,64位地址长度是64,32位地址长度是32,这意味着运算时要补32个0,这极大的消耗了设备的性能
②硬件问题,这就是说64位程序的算力要是32位的2倍前提是硬件必须支持
实测:
接下来辩论进入白热化阶段,越来越多的大佬开始参与这个话题,于是开始跑代码
上图的代码是由VS2019生成工具这个编译器编译的,这个编译器可以说代表了当前程序开发执行速度这一块的最高水平了,大家自然是没有意见,本程序进行了100亿次的循环运算,最后32位程序耗时360毫秒,64位程序耗时781毫秒,多次测试结果相差不大,随后又进行了一些常用指令的运算测试,基本是32位程序更胜一筹
随后,又引来了一名大佬的加入,其表示研究过这个问题,并引用了下面大佬的意见
提示1:32位程序和64位程序不是2套代码,你可以选择打包成32位和64位,说明这个问题是怕一些朋友觉得代码写法不一样不能对比
提示2:32位和64位指的是地址长度,不是32位系统能同时执行32条指令,64位系统能同时执行64条线程,我觉得这个说法比较炸裂
结论:
32位程序一般情况运行速度是要比64位快的,但是不是说32位程序的运行速度一定比64位要快,分场景的,在小部分情况了64位比32位要快。至于说64位的运行速度是32位的2倍那是基本上不存在的事
那为什么很多人觉得64位程序很牛逼,这个问题之前讲过了,因为32位程序理论支持最大内存就是4G,所以一些大型游戏和程序都是64位的,所以不是64位程序NB,而是人家这个程序NB只能打包成64位,这么多牛逼的程序都是64位的,所以觉得64位比32位牛逼很多
欢迎大家对于这个问题留下自己的见解,也可以网上搜索相关资料进行讨论
重点:
本文不在于讨论32和64谁更快,讨论这个问题是为了给新手提供条参考建议,大家开发的程序是否有没有必要强制去打包成64位,所以论证的核心点是64位程序是不是比32位快(很多人认为64的程序实际处理速度是32位的2倍,所以总想着自己的程序必须64位,结果耗时费力,最后可能效果反而更慢,很多人问过我自己的程序升级成64要多少钱这个问题)至于什么时候什么场景谁更快这个只能算闲谈了
所以我想表达的一个观点是,对于各位编程爱好者来说,你的程序没有必要去升级成64,你认为升级会速度加倍,实际上很有可能会减慢(至于到底有多大概率会减慢,我个人的意见是超过50%,具体多少还有待讨论)
(点击返回课程目录:https://www.52hb.com/thread-58658-1-1.html)
楼主好厉害看硬了 请提供“运行100亿次”程序的源代码。
{:5_121:} 本帖最后由 书香 于 2024-2-19 20:47 编辑
boot 发表于 2024-2-19 20:25
请提供“运行100亿次”程序的源代码。
{:5_116:}可以的,就是很简单的计次循环,然后循环里自定义一个算法,比如a=a*9-6 (a是当前的循环次数)
谢谢分享! 书香 发表于 2024-2-19 20:37
可以的,就是很简单的计次循环,然后循环里自定义一个算法,比如a=a*9-6 (a是当前的循环次数)
...
④:书香及部分人的观点是32位一般情况都比64位速度要快
这个结论不完全对。当进行复合运算时,64位的速度是32位的两倍。
证明:
32位
64位
实例:
本帖最后由 书香 于 2024-2-20 09:47 编辑
boot 发表于 2024-2-20 03:56
这个结论不完全对。当进行复合运算时,64位的速度是32位的两倍。
证明:
你这个数据类型长度不一样了,相当于完全进入了64位的统治领域,32位一次性只能处理4字节数据{:5_116:},双精度浮点数类型是8字节的,但是其实单精度浮点数4个字节也够用了,目前其实就是第3点和第4点的辩论
③:64位和32位谁快不一定,分场景
④:书香及部分人的观点是32位一般情况都比64位速度要快
具体测试应该要贴近于常见的代码,如基础运算(变量操作),数据读写(硬盘操作),系统类操作等,我觉得对于一般软件而言,32位的性能是要更优越的,因为32位单次处理的字节数据量已经基本符合要求了,但是64位程序无法在32位的设备上运行(意味着要抛弃32位系统的用户)
所以这篇文章的目的就是说大家软件一般打包成32位即可,不需要非得去打包成64位(很多人一直以为64位程序的实际处理速度是32位的2倍)
比较32位和64位运行速度感觉就是个伪命题,如上代码中调用处理器指令计算tick,显示x64比x32快,cpuid在寄存器中写入信息是只用了32位。并且除时间计数外并没有使用指针指向。
这也就是意味着,在使用64位处理器指令集时,32位操作大概率会减缓处理器的数据吞吐量。例如SSE、AVX等将会拖慢运行速度
编译器使用:Intel OneAPI C++ 2024编译器(支持x64汇编)
仅为个人观点,欢迎指正
oawxx 发表于 2024-2-20 23:18
比较32位和64位运行速度感觉就是个伪命题,如上代码中调用处理器指令计算tick,显示x64比x32快,cpuid在寄 ...
这个问题关键就在于处理的数据是多少位的,我觉得大多数情况下(大家基本都是个人或几个人的开发),32位数据够用了
实际上,讨论这个问题是为了给新手提供条参考建议,大家开发的程序是否有没有必要强制去打包成64位,所以论证的核心点是64位程序是不是比32位快(很多人认为64的程序实际处理速度是32位的2倍,所以总想着自己的程序必须64位,结果耗时费力,最后可能效果反而更慢,很多人问过我自己的程序升级成64要多少钱这个问题)至于什么时候什么什么场景谁更快这个只能算闲谈了
所以我想表达的一个观点是,对于各位编程爱好者来说,你的程序没有必要去升级成64,你认为升级会速度加倍,实际上很有可能会减慢(至于到底有多大概率会减慢,我个人的意见是超过50%,具体多少还有待讨论)
是的,32位升级成64位并不会出现速度成倍的提升,一如visual studio 2019(32位)和visual studio 2022(64位)相比,哪怕是微软也没能让其性能完全提升到一倍以上,只有少部分能提升一倍甚至两倍以上。但绝大多数的提升只有一点点。相对来说开发64位程序提升程序执行速度并不是关键点。主要还是以适应性为主,在微软完全抛弃32位之前,数据吞吐量不大的程序没必要执着于32位和64位之分
页:
[1]
2