當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式微處理器
[導(dǎo)讀]自從編程語言誕生以來,人們常常就哪種語言速度最快的問題爭論不休。無論是嚴(yán)肅的科學(xué)研究,還是深夜酒吧的喧囂,都不乏關(guān)于這個話題的爭執(zhí)。文本不打算就這個問題展開討論,我們不妨從一個更高的層面來看一看這個問題:如何比較兩種截然不同的編程語言的性能。為了進(jìn)行有意義的比較,我們必須使用兩種...

自從編程語言誕生以來,人們常常就哪種語言速度最快的問題爭論不休。無論是嚴(yán)肅的科學(xué)研究,還是深夜酒吧的喧囂,都不乏關(guān)于這個話題的爭執(zhí)。文本不打算就這個問題展開討論,我們不妨從一個更高的層面來看一看這個問題:如何比較兩種截然不同的編程語言的性能。為了進(jìn)行有意義的比較,我們必須使用兩種編程語言實現(xiàn)一系列測試程序,運(yùn)行基準(zhǔn)測試,然后再比較最后的結(jié)果。

實際上,這種比較的難度很大,有時甚至非常費(fèi)時費(fèi)力。盡管問題本身看起來很簡單,但大量可能出現(xiàn)錯誤的地方會導(dǎo)致一無所知的性能測試員遭遇坎坷,有時即使非常了解也無濟(jì)于事。


01?等效的實現(xiàn)?


為了公平地比較兩種語言的實現(xiàn),編寫出來的程序的質(zhì)量應(yīng)該達(dá)到同等水平。也就是說,必須由某位對兩種編程語言以及領(lǐng)域知識的掌握程度大致相同的人來編寫程序。這本身就很難。如果由不同的人來編寫實現(xiàn),那么他們可能會選擇不同的算法來解決問題,這樣的性能比較就不再是編程語言本身的問題,而是每位程序員選擇的編程方法的問題。

即使兩個實現(xiàn)都是由同一個人使用相同的算法編寫的,仍然存在其他問題。通常,每個人都有自己擅長的語言。因此,他們會選擇自己喜歡的語言提供更快的實現(xiàn)。這就會引發(fā)偏差,因為這樣的性能比較衡量的不是編程語言本身,而更多的是程序員。這類的測試適合尋找易用性與生產(chǎn)力的差異,但對比較性能而言則不合適。

因此,你可能需要評估許多專業(yè)程序員已經(jīng)編寫好的程序。這是一個很好的方法,但有時即使是經(jīng)驗豐富的研究也會出錯。有一篇論文試圖通過這種方法比較不同的編程語言的性能和效率。他們的測試結(jié)果表明,某個程序用C實現(xiàn)比C 實現(xiàn)快30%。這個測試結(jié)果影響了整個論文的基調(diào)。按照這個論斷,假設(shè)將所有 C 源代碼的文件擴(kuò)展名 .c 改為.cpp并重新編譯,應(yīng)該能得到大致相同的結(jié)果(可能會有幾個百分點的誤差)。所以我們只能得出以下結(jié)論(按照可能性從高到低排列):

  1. C 版本的代碼比較差;

  2. 測試方法有明顯的瑕疵;

  3. 與C相比,該編譯器對C 的性能有重大的負(fù)面影響。

換句話說,上述呈現(xiàn)的差異并非來自編程語言本身。


02?測量的難度

?

還有一個很大的問題是,如何測量某個程序的性能。一種常見的方法是連續(xù)運(yùn)行多次測試,然后執(zhí)行如下操作:

  1. 處理異常值:去掉兩個極值(即最慢和最快的測量值);

  2. 計算剩余數(shù)據(jù)點的平均值和/或中位數(shù);

  3. 比較不同程序之間的結(jié)果,速度最快的程序獲勝。

上過統(tǒng)計課程的人可能還記得如何計算標(biāo)準(zhǔn)差。這種方法看似合理且嚴(yán)謹(jǐn),但其實包含多個系統(tǒng)誤差。其中最大的問題涉及測量中的噪聲。

大多數(shù)基本的統(tǒng)計工具都會假設(shè)誤差呈正態(tài)分布,平均值為零。如果測量的是溫度或速度之類,則這個假設(shè)是合理的。然而,對于編程語言的性能測量來說,這個假設(shè)并不合理。程序的運(yùn)行時間包括實際上花費(fèi)在解決問題上的時間,以及來自操作系統(tǒng)中斷、磁盤訪問等方面的開銷。如果我們假設(shè)噪聲為平均值為零的高斯噪聲,那么這意味著計算機(jī)有一些未知的過程,可以讓程序的運(yùn)行速度超過完全無噪聲時的情況。這當(dāng)然是不可能的。這里的噪聲肯定不是高斯噪聲,因為它永遠(yuǎn)不會出現(xiàn)負(fù)值。

事實上,最接近柏拉圖式理想答案的測量結(jié)果就是最快的,因為這種情況下來自系統(tǒng)噪聲的干擾最少。這樣的測量結(jié)果會被上述第一步操作“處理異常值”刪除。有時,采用合理的、現(xiàn)成的措施只會讓事情變得更糟。


03?統(tǒng)計的難度更大

?

暫時撇開這一點不談,我們假設(shè)我們獲得了兩個程序的性能測試結(jié)果,且這個結(jié)果看似確實“很高斯”。數(shù)值分析表明,1號語言的運(yùn)行花費(fèi)了10秒,而2號語言花費(fèi)了9秒。二者的差異為10%,因此我們就可以得出結(jié)論:2號語言的速度更快。這個結(jié)果正確嗎?

很遺憾,不正確。假設(shè)實際測量數(shù)據(jù)如下:

?


右邊的那個更快,對不對?也許?大概?可能?為了正確回答這個問題,我們需要回顧一下大學(xué)學(xué)習(xí)的統(tǒng)計知識。首先,提出零假設(shè),即假設(shè)兩個程序沒有性能差異。接著,計算這兩次測量結(jié)果來自同一個概率分布的概率。如果概率非常小(通常為5%),則可以推翻零假設(shè),從而證明其中一個程序比另一個快。這種方法叫做學(xué)生t檢驗,常用于大量數(shù)據(jù)的統(tǒng)計。請注意,測試的某些實現(xiàn)會假設(shè)數(shù)據(jù)符合高斯分布,如果你的數(shù)據(jù)呈現(xiàn)其他形狀,則結(jié)果可能并不可靠。

這種方式適用于一個程序,但嚴(yán)格的測試需要包含多個程序。這些評估也有一些統(tǒng)計方法,但會非常復(fù)雜。具體的做法留給讀者自行查閱。


04?所有計算機(jī)的對齊都是雙刃劍

?

雖然統(tǒng)計非常難,但幸運(yùn)的是計算機(jī)很簡單,因為它們具有確定性、可靠,而且合乎邏輯。例如,如果在一個程序中添加一條NOP指令,則結(jié)果可能只是多了一個指令周期,對性能的影響小到無法測量。但是,如果你非要測量,那么結(jié)果可能會讓你陷入不解和困惑。這個小小的改動有時會讓程序的運(yùn)行時間增加10%(甚至更長),但也有可能縮短10%。你沒看錯,這類看似無意義的工作可以加快程序的運(yùn)行速度。如果是第一次遇到這樣的問題,你可能壓根不會相信。?

那么,問題在于,是否有可能讓CPU加倍努力,讓程序更快地運(yùn)行呢?答案為否。實際的指令根本無關(guān)緊要。重點在于代碼的對齊。代碼在內(nèi)存中的不同位置會影響其性能特征。如果一段經(jīng)常被執(zhí)行的循環(huán)跨越了緩存邊界,它就會變慢。將其移動到不跨越邊界的地方就能加快其速度。NOP指令并不一定要放在循環(huán)內(nèi),只要它能將整個代碼塊向上或向下移動,就可能導(dǎo)致這種差異。假設(shè)你以非常嚴(yán)謹(jǐn)?shù)慕y(tǒng)計方式測量了兩個程序。如果二者之間的性能差異低于10%,則我們就無法斷言哪個程序更快,除非你使用的測量方式能夠消除對齊效應(yīng)。


05?這是關(guān)于機(jī)器的性能測量,而不是語言

?

隨著程序的運(yùn)行速度越來越快,優(yōu)化經(jīng)歷了一個有趣的階段轉(zhuǎn)變。一旦性能達(dá)到一定水平,系統(tǒng)就不再關(guān)心編譯器和CPU如何才能加快程序的運(yùn)行速度。相反,變成了程序員如何盡可能有效地利用CPU,例如將數(shù)據(jù)排列成方便處理器處理的布局等。這意味著用基于硬件的原語替換基于語言的原語。某些圈子采用的優(yōu)化方式非常奇怪,程序員甚至知道他們的循環(huán)應(yīng)該被優(yōu)化成哪些SIMD指令,然后他們會不停地修改代碼,直到實現(xiàn)這種優(yōu)化。其實,這種優(yōu)化已經(jīng)與編程語言本身的功能沒有絲毫關(guān)系了。

這就是為什么C和Fortran之類的語言仍在許多性能基準(zhǔn)測試中名列前茅的主要原因,但這些技巧并不限于這些語言。幾年前,我開發(fā)了一款規(guī)模非常大的Java應(yīng)用程序,該應(yīng)用程序經(jīng)過了非常徹底的優(yōu)化。其內(nèi)部由整數(shù)數(shù)組組成。最常執(zhí)行的路徑中沒有類,甚至沒有Integer對象,基本上就形同于在Java語言內(nèi)部重塑了C語言。其實,幾乎任何編程語言都可以有類似的實現(xiàn)。它們之間的性能差異主要取決于每個編譯器的優(yōu)化器。即便使用相同的編程語言,也會產(chǎn)生截然不同的性能結(jié)果,更不用說不同的編程語言了。因此,聲稱某一種編程語言在性能上有明顯的優(yōu)勢都是不合理的,因為說到底都是內(nèi)聯(lián)匯編程序。

原文鏈接:

https://nibblestew.blogspot.com/2021/02/why-most-programming-language.html?m=1

END
來源:CSDN版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。
嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉