高票說的很棒了,我來提供另一個視角吧。
現在為了便宜、方便,絕大部份程式是用手稿語言寫的。
這是因為手稿語言入門簡單,很容易就能雇到程式設計師;而公認高效的編譯型語言如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的熱,享用著奔騰Ⅱ的效能……如此一來,你不卡,誰卡?