当前位置: 华文星空 > 知识

为什么现代 CPU 每秒数亿次计算,但是程序仍旧很卡?

2022-10-19知识

高票说的很棒了,我来提供另一个视角吧。

现在为了便宜、方便,绝大部分程序是用脚本语言写的。

这是因为脚本语言入门简单,很容易就能雇到程序员;而公认高效的编译型语言如C、C++、Delphi,或者即地编译的Java等专业语言入门门槛很高——起码知乎上已经有很多人持续好多年的希望它们灭绝了。以至于一旦我提到C,经常就有一票人在我的评论区酸溜溜的对以汇编……

但是,python/php/js之类语言的性能是非常糟糕的。比如这个就是一个很不全面的测试:

来自: Python与C语言、Java、Nodejs、Golang进行性能测试比较 - 云+社区 - 腾讯云 (tencent.com)

可以看出,在查找质数这个测试场景下,C/Java的执行效率是python的20/17倍。

这是个什么概念呢?

现代CPU的主频大约是4~5G,它的1/20是250MHZ。

换句话说,不考虑多核因素,只算单核性能的话——你以为你在用最先进的i9?

错。你不过是在用老掉牙的、1997年上市的奔腾2代罢了。

24年前的老爷车能跑出这个效果,知足吧。

当然,奔腾2也很强了。对个人用户的常规任务来说,它完全是性能溢出。这就是python、js大行其道的根本原因——对你来说,它足够用了。

但,这也正是C/C++、Java必须继续存在的根本原因——在它们的帮助下,才能让python把i9当奔腾Ⅱ 266MHZ用,帮你处理点不需要性能的日常任务。一旦需要性能……

尤其是,为了方便、易控制,现在恨不得一切都用p跑在浏览器里。

注意这里并不是说脚本语言是程序卡的根本原因;事实上,电脑上所有性能敏感的地方,跑的都是C/C++或者Java(甚至,由于GC造成的stop world问题,很多地方Java都是不能用的);现代的高分辨率高帧率图像的确也需要非常非常多的性能。

这里说的是:类似脚本语言替代编译型语言这样,为了方便程序员、降低开发费用而作的「负优化」特别特别的多,多到已经规模化、系统化、标准化的程度了。

此外,国内厂商,为了垄断或者别的什么原因,致力于负优化或者阉割你的系统……

举例来说,Android有个webview组件。这个东西在Android 4.4之前基于webkit,之后就是chrome内核了——这玩意儿对p的支持还是很不错的。

但是,国内手机厂商不约而同的阉割了这个组件,故意制造不兼容。

结果就是,除非你的app自带浏览器内核,否则就别想正常运行。

为什么我说他们是故意呢?

因为最近调一个程序,丢浏览器能跑,放手机上不行;再一试手机自带浏览器,也不行——然而Google play装的chrome又行了。

于是决定看看究竟哪的问题,打开http:// html5test.com ,手机自带浏览器得分还挺高;尤其其中我们程序功能相关的特性居然也有。

那怎么不执行我们的程序呢?想了想,我尝试重新打开过去跑不过的那个应用。顺利打开。

明白了,发现你跑html5test,它就临时打开开关,让你看它特性支持的足足的;不跑,那就不给你支持。

于是继续查,看看webview能跑多少分——果然,webview得分极低,把本来支持的近80项html5特性都关掉了。

这就使得这些阉割版系统的webview组件压根没法用。除非自带浏览器内核,绕开这个玩意儿。

举例来说,国内某龙头企业的即时通讯软件,它的国内版就不得不带了个蹩脚的浏览器组件。不然很多功能就没法实现。

但这个组件使得软件变得更加臃肿;且优化水平很差,使得这玩意儿用起来总是能明显感觉到卡卡的——正常的js引擎跑Javascript,如果还能有C的性能1/20的话,这个组件可能就只能到1/23或者1/25,甚至更差。

如果你用的是海外版或者国外品牌的手机,那么可以通过控制台卸载这个组件,让它用标准的webview,流畅度就会立竿见影的提升;但如果你用的是国内版的手机……卸载这个组件只会让它崩溃、或者页面故障。

类似的,你直接从Google play装的这个软件,它就原生不带这个组件——后果嘛,那就是流畅多了。

当然,前提是你不能用国产阉割版手机系统。卡点总比用不了强。

类似的,知乎手机版也自带了一个很烂的浏览器。chromium 87内核,html5test只有469分。但这个玩意儿比起手机自带的破烂油腻UI浏览器的444分还是高了不少。

可想而知,如果不浪费你的空间、使用阉割更严重的手机自带webview的话,体验会烂到什么地步、开发测试又会不可控到什么地步。

总之,在这些「负优化」的共同努力下,你的电脑经常要发着i9的热,享用着奔腾Ⅱ的性能……如此一来,你不卡,谁卡?