91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何比較兩種截然不同的編程語(yǔ)言的性能

Q4MP_gh_c472c21 ? 來(lái)源:博客 ? 作者:Nibble Stew ? 2021-09-02 14:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

自從編程語(yǔ)言誕生以來(lái),人們常常就哪種語(yǔ)言速度最快的問(wèn)題爭(zhēng)論不休。無(wú)論是嚴(yán)肅的科學(xué)研究,還是深夜酒吧的喧囂,都不乏關(guān)于這個(gè)話(huà)題的爭(zhēng)執(zhí)。文本不打算就這個(gè)問(wèn)題展開(kāi)討論,我們不妨從一個(gè)更高的層面來(lái)看一看這個(gè)問(wèn)題:

如何比較兩種截然不同的編程語(yǔ)言的性能。為了進(jìn)行有意義的比較,我們必須使用兩種編程語(yǔ)言實(shí)現(xiàn)一系列測(cè)試程序,運(yùn)行基準(zhǔn)測(cè)試,然后再比較最后的結(jié)果。

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

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

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

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

因此,你可能需要評(píng)估許多專(zhuān)業(yè)程序員已經(jīng)編寫(xiě)好的程序。這是一個(gè)很好的方法,但有時(shí)即使是經(jīng)驗(yàn)豐富的研究也會(huì)出錯(cuò)。有一篇論文試圖通過(guò)這種方法比較不同的編程語(yǔ)言的性能和效率。

他們的測(cè)試結(jié)果表明,某個(gè)程序用C實(shí)現(xiàn)比C++實(shí)現(xiàn)快30%。這個(gè)測(cè)試結(jié)果影響了整個(gè)論文的基調(diào)。按照這個(gè)論斷,假設(shè)將所有 C 源代碼的文件擴(kuò)展名 .c 改為.cpp并重新編譯,應(yīng)該能得到大致相同的結(jié)果(可能會(huì)有幾個(gè)百分點(diǎn)的誤差)。所以我們只能得出以下結(jié)論(按照可能性從高到低排列):

C++版本的代碼比較差;

測(cè)試方法有明顯的瑕疵;

與C相比,該編譯器對(duì)C++的性能有重大的負(fù)面影響。換句話(huà)說(shuō),上述呈現(xiàn)的差異并非來(lái)自編程語(yǔ)言本身。

02 測(cè)量的難度

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

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

計(jì)算剩余數(shù)據(jù)點(diǎn)的平均值和/或中位數(shù);

比較不同程序之間的結(jié)果,速度最快的程序獲勝。上過(guò)統(tǒng)計(jì)課程的人可能還記得如何計(jì)算標(biāo)準(zhǔn)差。這種方法看似合理且嚴(yán)謹(jǐn),但其實(shí)包含多個(gè)系統(tǒng)誤差。其中最大的問(wèn)題涉及測(cè)量中的噪聲。

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

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

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

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

很遺憾,不正確。

右邊的那個(gè)更快,對(duì)不對(duì)?也許?大概?可能?為了正確回答這個(gè)問(wèn)題,我們需要回顧一下大學(xué)學(xué)習(xí)的統(tǒng)計(jì)知識(shí)。首先,提出零假設(shè),即假設(shè)兩個(gè)程序沒(méi)有性能差異。接著,計(jì)算這兩次測(cè)量結(jié)果來(lái)自同一個(gè)概率分布的概率。

如果概率非常?。ㄍǔ?%),則可以推翻零假設(shè),從而證明其中一個(gè)程序比另一個(gè)快。這種方法叫做學(xué)生t檢驗(yàn),常用于大量數(shù)據(jù)的統(tǒng)計(jì)。請(qǐng)注意,測(cè)試的某些實(shí)現(xiàn)會(huì)假設(shè)數(shù)據(jù)符合高斯分布,如果你的數(shù)據(jù)呈現(xiàn)其他形狀,則結(jié)果可能并不可靠。

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

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

雖然統(tǒng)計(jì)非常難,但幸運(yùn)的是計(jì)算機(jī)很簡(jiǎn)單,因?yàn)樗鼈兙哂写_定性、可靠,而且合乎邏輯。例如,如果在一個(gè)程序中添加一條NOP指令,則結(jié)果可能只是多了一個(gè)指令周期,對(duì)性能的影響小到無(wú)法測(cè)量。

但是,如果你非要測(cè)量,那么結(jié)果可能會(huì)讓你陷入不解和困惑。這個(gè)小小的改動(dòng)有時(shí)會(huì)讓程序的運(yùn)行時(shí)間增加10%(甚至更長(zhǎng)),但也有可能縮短10%。你沒(méi)看錯(cuò),這類(lèi)看似無(wú)意義的工作可以加快程序的運(yùn)行速度。如果是第一次遇到這樣的問(wèn)題,你可能壓根不會(huì)相信。

那么,問(wèn)題在于,是否有可能讓CPU加倍努力,讓程序更快地運(yùn)行呢?答案為否。實(shí)際的指令根本無(wú)關(guān)緊要。重點(diǎn)在于代碼的對(duì)齊。代碼在內(nèi)存中的不同位置會(huì)影響其性能特征。

如果一段經(jīng)常被執(zhí)行的循環(huán)跨越了緩存邊界,它就會(huì)變慢。將其移動(dòng)到不跨越邊界的地方就能加快其速度。NOP指令并不一定要放在循環(huán)內(nèi),只要它能將整個(gè)代碼塊向上或向下移動(dòng),就可能導(dǎo)致這種差異。

假設(shè)你以非常嚴(yán)謹(jǐn)?shù)慕y(tǒng)計(jì)方式測(cè)量了兩個(gè)程序。如果二者之間的性能差異低于10%,則我們就無(wú)法斷言哪個(gè)程序更快,除非你使用的測(cè)量方式能夠消除對(duì)齊效應(yīng)。

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

隨著程序的運(yùn)行速度越來(lái)越快,優(yōu)化經(jīng)歷了一個(gè)有趣的階段轉(zhuǎn)變。一旦性能達(dá)到一定水平,系統(tǒng)就不再關(guān)心編譯器和CPU如何才能加快程序的運(yùn)行速度。相反,變成了程序員如何盡可能有效地利用CPU,例如將數(shù)據(jù)排列成方便處理器處理的布局等。

這意味著用基于硬件的原語(yǔ)替換基于語(yǔ)言的原語(yǔ)。某些圈子采用的優(yōu)化方式非常奇怪,程序員甚至知道他們的循環(huán)應(yīng)該被優(yōu)化成哪些SIMD指令,然后他們會(huì)不停地修改代碼,直到實(shí)現(xiàn)這種優(yōu)化。其實(shí),這種優(yōu)化已經(jīng)與編程語(yǔ)言本身的功能沒(méi)有絲毫關(guān)系了。

這就是為什么C和Fortran之類(lèi)的語(yǔ)言仍在許多性能基準(zhǔn)測(cè)試中名列前茅的主要原因,但這些技巧并不限于這些語(yǔ)言。幾年前,我開(kāi)發(fā)了一款規(guī)模非常大的Java應(yīng)用程序,該應(yīng)用程序經(jīng)過(guò)了非常徹底的優(yōu)化。

其內(nèi)部由整數(shù)數(shù)組組成。最常執(zhí)行的路徑中沒(méi)有類(lèi),甚至沒(méi)有Integer對(duì)象,基本上就形同于在Java語(yǔ)言?xún)?nèi)部重塑了C語(yǔ)言。其實(shí),幾乎任何編程語(yǔ)言都可以有類(lèi)似的實(shí)現(xiàn)。

它們之間的性能差異主要取決于每個(gè)編譯器的優(yōu)化器。即便使用相同的編程語(yǔ)言,也會(huì)產(chǎn)生截然不同的性能結(jié)果,更不用說(shuō)不同的編程語(yǔ)言了。因此,聲稱(chēng)某一種編程語(yǔ)言在性能上有明顯的優(yōu)勢(shì)都是不合理的,因?yàn)檎f(shuō)到底都是內(nèi)聯(lián)匯編程序。

原文鏈接:

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

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3716

    瀏覽量

    97193
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2124

    瀏覽量

    77130
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2953

    瀏覽量

    70332
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51626

原文標(biāo)題:為什么大多數(shù)編程語(yǔ)言性能對(duì)比都有問(wèn)題?

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    商用車(chē)電驅(qū)動(dòng)SiC功率模塊選型的結(jié)構(gòu)性分析:HPD封裝的局限與ED3封裝的技術(shù)復(fù)興

    全球交通電氣化的浪潮已呈現(xiàn)出兩種截然不同的技術(shù)演進(jìn)路徑:以高產(chǎn)量、中等電壓架構(gòu)(400V-800V)為特征的乘用車(chē)(Passenger Electric Vehicle, PEV)市場(chǎng),以及涵蓋重型卡車(chē)、客車(chē)及工程機(jī)械的商用車(chē)(Commercial Vehicle, CV
    的頭像 發(fā)表于 01-27 17:23 ?568次閱讀
    商用車(chē)電驅(qū)動(dòng)SiC功率模塊選型的結(jié)構(gòu)性分析:HPD封裝的局限與ED3封裝的技術(shù)復(fù)興

    C語(yǔ)言與C++的區(qū)別及聯(lián)系

    C語(yǔ)言和C++到底是什么關(guān)系? 首先C++和C語(yǔ)言本來(lái)就是兩種不同的編程語(yǔ)言,但C++確實(shí)是對(duì)C語(yǔ)言
    發(fā)表于 12-24 07:23

    為什么單片機(jī)還在用C語(yǔ)言編程?

    最適合單片機(jī)開(kāi)發(fā)的編程語(yǔ)言實(shí)在太過(guò)晦澀難懂,學(xué)習(xí)起來(lái)非常的不方便,并且每一單片機(jī)的匯編指令有很大區(qū)別,所以想把一個(gè)程序從這種單片機(jī)移植到另一單片機(jī)簡(jiǎn)直是癡心妄想,重新寫(xiě)一遍程序還來(lái)
    發(fā)表于 11-28 07:37

    用PLC實(shí)現(xiàn)卷徑計(jì)算的兩種算法

    卷徑計(jì)算,是動(dòng)態(tài)計(jì)算如鋼卷,紙卷等存料量的一方法,它是實(shí)現(xiàn)張力控制和自動(dòng)充放料、以及甩尾控制的重要前提。卷徑計(jì)算目前主流的方法有兩種,一是根據(jù)機(jī)列速度(產(chǎn)線(xiàn)速度)和和被測(cè)卷的轉(zhuǎn)動(dòng)角速度求得;另一
    的頭像 發(fā)表于 11-14 16:54 ?2089次閱讀
    用PLC實(shí)現(xiàn)卷徑計(jì)算的<b class='flag-5'>兩種</b>算法

    航裕電源HY-LCS系列在低壓電器測(cè)試中的應(yīng)用

    對(duì)此,工程師們常常面臨一個(gè)共性難題:如何用一臺(tái)設(shè)備同時(shí)滿(mǎn)足高電壓小電流與低電壓大電流這兩種截然不同的測(cè)試需求?
    的頭像 發(fā)表于 11-11 16:09 ?778次閱讀
    航裕電源HY-LCS系列在低壓電器測(cè)試中的應(yīng)用

    一文了解Mojo編程語(yǔ)言

    Mojo 是一由 Modular AI 公司開(kāi)發(fā)的編程語(yǔ)言,旨在將 Python 的易用性與 C 語(yǔ)言的高性能相結(jié)合,特別適合人工智能(A
    發(fā)表于 11-07 05:59

    兩種TVS有啥不同?

    當(dāng)我們查看TVS二極管的規(guī)格書(shū),常會(huì)看到有以下兩種種引腳功能標(biāo)識(shí)圖:對(duì)于初學(xué)者,看到感到疑惑,他們一樣嗎?他們有啥區(qū)別?為啥有的個(gè)尖頭往外,陽(yáng)極連在一起,有的個(gè)尖頭往里,陰極連在一起?一連三問(wèn)。EMC小哥根據(jù)自己經(jīng)驗(yàn)略作分析
    的頭像 發(fā)表于 09-15 20:27 ?802次閱讀
    這<b class='flag-5'>兩種</b>TVS有啥不同?

    兩種散熱路徑的工藝與應(yīng)用解析

    背景:兩種常見(jiàn)的散熱設(shè)計(jì)思路 在大電流或高功率器件應(yīng)用中,散熱和載流能力是PCB設(shè)計(jì)中必須解決的難題。常見(jiàn)的兩種思路分別是: 厚銅板方案:通過(guò)整體增加銅箔厚度(如3oz、6oz甚至更高),增強(qiáng)導(dǎo)熱
    的頭像 發(fā)表于 09-15 14:50 ?788次閱讀

    CMOS 2.0與Chiplet兩種創(chuàng)新技術(shù)的區(qū)別

    摩爾定律正在減速。過(guò)去我們靠不斷縮小晶體管尺寸提升芯片性能,但如今物理極限越來(lái)越近。在這樣的背景下,兩種創(chuàng)新技術(shù)站上舞臺(tái):CMOS 2.0 和 Chiplet(芯粒)。它們都在解決 “如何讓芯片更強(qiáng)” 的問(wèn)題,但思路卻大相徑庭。
    的頭像 發(fā)表于 09-09 15:42 ?1028次閱讀

    AD、Allegro、Pads的快捷鍵有什么不同

    在高速迭代的電子設(shè)計(jì)領(lǐng)域,快捷鍵是工程師與EDA工具對(duì)話(huà)的核心語(yǔ)言,縱觀(guān)EDA工具,AD的視覺(jué)化交互、Allegro的深度可編程性、Pads的無(wú)膜命令——三理念催生了截然不同的操作邏
    的頭像 發(fā)表于 08-06 13:49 ?2236次閱讀
    AD、Allegro、Pads的快捷鍵有什么不同

    【BPI-CanMV-K230D-Zero開(kāi)發(fā)板體驗(yàn)】+兩種開(kāi)發(fā)板間的比較

    之所以產(chǎn)生出在兩種開(kāi)發(fā)板間進(jìn)行比較的想法,是與當(dāng)初申請(qǐng)的一個(gè)想法相關(guān)的就是,就是利用該開(kāi)發(fā)板來(lái)完成一個(gè)考生識(shí)別的作品。 但在后來(lái)的資料分析時(shí)才發(fā)現(xiàn),它可能并不具備這方面的基礎(chǔ)。這就有請(qǐng)我們的下一
    發(fā)表于 07-17 21:40

    貼片晶振中兩種常見(jiàn)封裝介紹

    貼片晶體振蕩器作為關(guān)鍵的時(shí)鐘頻率元件,其性能直接關(guān)系到系統(tǒng)運(yùn)行的穩(wěn)定性。今天,凱擎小妹帶大家聊聊貼片晶振中兩種常見(jiàn)封裝——金屬面封裝與陶瓷面封裝。
    的頭像 發(fā)表于 07-04 11:29 ?1266次閱讀
    貼片晶振中<b class='flag-5'>兩種</b>常見(jiàn)封裝介紹

    兩種驅(qū)動(dòng)方式下永磁直線(xiàn)開(kāi)關(guān)磁鏈電機(jī)的研究

    摘要:永磁開(kāi)關(guān)磁鏈電機(jī)數(shù)學(xué)模型可以等效為永磁無(wú)刷電機(jī),普遍采用方波驅(qū)動(dòng)方式。在有限元基礎(chǔ)上分析6/7極直線(xiàn)式磁鏈電機(jī)反電勢(shì)波形,采用方波和正弦波驅(qū)動(dòng)方式,比較兩種方式下的電流、電壓、平均推力大小
    發(fā)表于 06-09 16:18

    兩種感應(yīng)電機(jī)磁鏈觀(guān)測(cè)器的參數(shù)敏感性研究

    模式和發(fā)電模式下對(duì)閉環(huán)電壓電流模型磁鏈觀(guān)測(cè)器和滑模磁鏈觀(guān)測(cè)器參數(shù)敏感性進(jìn)行了研究,通過(guò)仿真和實(shí)驗(yàn)比較了這兩種觀(guān)測(cè)器對(duì)定、轉(zhuǎn)子電阻及勵(lì)磁電感的敏感性。同時(shí)還研究了基于這兩種觀(guān)測(cè)器的模型參考自適應(yīng)系統(tǒng)
    發(fā)表于 06-09 16:16

    深入理解C語(yǔ)言:C語(yǔ)言循環(huán)控制

    改變程序的執(zhí)行流程,使代碼更加靈活和可控。本文將詳細(xì)介紹這些語(yǔ)句的作用及其應(yīng)用場(chǎng)景,并通過(guò)示例代碼進(jìn)行說(shuō)明。Part.1break語(yǔ)句C語(yǔ)言中break語(yǔ)句有兩種
    的頭像 發(fā)表于 04-29 18:49 ?2050次閱讀
    深入理解C<b class='flag-5'>語(yǔ)言</b>:C<b class='flag-5'>語(yǔ)言</b>循環(huán)控制