日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
系統(tǒng)級(jí)編程語(yǔ)言性能大PK D語(yǔ)言成首選

"C/C++已經(jīng)統(tǒng)治系統(tǒng)編程很久,除了ObjectiveC之外語(yǔ)言都無(wú)法獲得很高的關(guān)注。有人用多種系統(tǒng)級(jí)語(yǔ)言編寫(xiě)了同樣的地圖生成工具來(lái)測(cè)試他們的性能,包括D(DMD,LDC,GDC)、Go(GCC-Go,6g)、Haskell(GHC)和Rust。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了歷下免費(fèi)建站歡迎大家使用!

相比C/C++,這些語(yǔ)言都原生支持了諸如垃圾回收這些高級(jí)特性,也因此無(wú)一能達(dá)到C/C++的運(yùn)行速度。這其中表現(xiàn)最差的是原生Go語(yǔ)言編譯器6g,只有Clang22%的速度,而表現(xiàn)最好的是基于LLVM的D語(yǔ)言編譯器LDC,達(dá)到了79%。

由于原生就使用了LLVM編譯,Rust成為各語(yǔ)言原生編譯器里最快的一個(gè),但也只達(dá)到了45%。從結(jié)果來(lái)看,D語(yǔ)言一定是首選。由于D語(yǔ)言許多特性都依賴?yán)厥眨绻枰P(guān)閉垃圾回收而又要保持良好的使用體驗(yàn),則推薦Rust。" (摘自:Solidot)

Go,Rust,Haskell和D四語(yǔ)言做關(guān)卡基準(zhǔn)測(cè)試

作者在為一款游戲制作隨機(jī)關(guān)卡生成器,盡管這個(gè)游戲是用C++編寫(xiě),且是模塊化,但是類似的關(guān)卡生成器卻可以用更高級(jí)的語(yǔ)言來(lái)編寫(xiě)。因?yàn)镃++并不是最好玩和最豐富的語(yǔ)言,所以作者打算選擇其他語(yǔ)言替代。

“如使用特別依賴迭代和條件句的簡(jiǎn)單Roguelike關(guān)卡基準(zhǔn),然后粗略模仿他們的真正生成器。”點(diǎn)擊此處獲取代碼。作者認(rèn)為Haskell語(yǔ)言的是最易讀的版本:

 
 
 
  1. roomHitRoom Room {rPos=(x,y), rw=w, rh=h} Room {rPos=(x2, y2), rw=w2, rh=h2}  
  2. | (x2 + w2 +1 ) < x || x2 > (x+w+1 ) = False  
  3. | (y2 + h2 +1 ) < y  || y2 > (y+h+1 ) = False  
  4. | otherwise = True 

檢查新生成的room與原有的room是否有沖突,如果有沖突就放棄(這是強(qiáng)攻關(guān)卡技巧;我們真正的引擎要更為復(fù)雜,但仍然遵循同樣的原則)。大多數(shù)剩余的時(shí)間花在了隨機(jī)數(shù)字生成上,所以給基準(zhǔn)加點(diǎn)料,使其像常速那樣具備單獨(dú)語(yǔ)言的隨機(jī)數(shù)字生成器(例如,這些基準(zhǔn)與作者的目標(biāo)相關(guān),而與你的無(wú)關(guān)。)。

PS:所有從Haskell分離出的部署現(xiàn)在都使用XorShift PRNG方法,比較起來(lái)更合理。

事實(shí)上,只有LDC D的使用XorShift,因?yàn)镈MD的用XorShift運(yùn)行起來(lái)比用C rand()要慢一些。一個(gè)部署XorShift PRND的Haskell版本可能是最受歡迎的。

結(jié)果如下 (C 語(yǔ)言版本用于對(duì)比)。

 
 
 
  1. 編譯器  LDC | Clang | GCC  | Rust  | GDC  | DMD  | GCCGo | GHC  | 6g   
  2. 時(shí)間:  0.412| 0.280 | 0.390 | 0.620 | 0.680 | 0.770 | 0.850 | 1.05 | 0.544  
  3. 最快(%): 68% | 100%  | 72%  | 45%  | 41%  | 37%  | 33%  | 27%  | 51% 

LDC,Rust和Clang所使用的LLVM版本是3.2.GCC,GCCGo使用的是GCC 4.7.3版本,GDC使用的是 GCC 4.6.4版本。Rust 是0.8-pre (9da42dc 2013-07-17 04:16:42 -0700) 版本,GHC是 7.6.2版本,DMD是2.036版本,6g(Go)是1.1.1版本。它們運(yùn)行的都是03,-opt-level=3可用于Rust,-release可用于DMD,-funbox-strict-fields可用于Haskell。**D現(xiàn)在運(yùn)行的時(shí)候同樣有-inline和-noboundscheck,所以其速度從1.36s增加到了1.59s。

D是目前測(cè)試過(guò)的最快的非C語(yǔ)言。在這里不得不表?yè)P(yáng)LDC編譯器的設(shè)計(jì)師們。作者非常期待著一年以內(nèi)再次運(yùn)行這些基準(zhǔn),看看Clang,LLVM D和LLVM Rust運(yùn)行得怎樣,并對(duì)它們做出比較。

Rust,雖然最初比較慢,但是通過(guò)XorShift PRNG,其速度已經(jīng)得到大幅提升。但是為了使Rust的句法適應(yīng)語(yǔ)境,所以Rust的靈活性要受一點(diǎn)點(diǎn)影響;要通過(guò)堆形分配的向量,不過(guò)需要引用myFunc(&mut myVector),接收到它的函數(shù)要在其類型簽名有myAlias:&mut~[myVector] ,和fn myFunc(myAlias:&mut ~[myVector]) {..} 一樣。與C比較則是

 
 
 
  1. void myFunc(struct MyType myAlias[arrayLength])  
  2. {  
  3. ..  
  4. }  

Rust版本看上去有點(diǎn)拜占庭的味道。還沒(méi)有用過(guò)Rust的人可以看看,這里給出7種指示符: @ (收集垃圾的堆形分配), ~ (獨(dú)特的堆形分配), & (借給堆形/堆棧分配的指示符), * (原始的C指示符, 僅限于不安全代碼), 以及前三種符號(hào)的變體(事實(shí)上,不確定是否真的有&指示符,所以可能總共只有6個(gè))。注意,具有可變值的指示符和沒(méi)有可變值的指示符是截然不同的。

作者還用堆棧分配型向量對(duì)Rust版本做了基準(zhǔn)測(cè)試,但是速度方面的差異不明顯。不過(guò)發(fā)現(xiàn)Rust中的堆棧分配型向量目前有點(diǎn)冗長(zhǎng),因?yàn)樗辉试S未初始化的值,所以不得不創(chuàng)建一個(gè)對(duì)象實(shí)例,作者想要一個(gè)所有值都被設(shè)置為零的數(shù)列,然后用上述創(chuàng)新來(lái)填充向量。希望,不久的將來(lái),Rust也能學(xué)習(xí)Go,將所有數(shù)值自動(dòng)設(shè)置為零,或者至少提供這樣一個(gè)可選項(xiàng)。目前,它看上去就像這樣:

(顯然,這種想法已經(jīng)成為可能(https://news.ycombinator.com/item?id=6094819)。希望下次升級(jí)的時(shí)候,Rust教程里能將其記錄下來(lái)。)

 
 
 
  1. et emptyr = Room {X:0,Y:0,W:0,H:0,N:0};  
  2. let emptyt = Tile{X:0,Y:0,T:0};  
  3. let emptyl = Lev{TS : [emptyt,..2500] , RS : [emptyr,..100] };  
  4. let mut ls : [Lev, ..100] = [emptyl,..100]; 

這里面有很多不必要的代碼,如果是使用堆棧分配型數(shù)列較多的大型項(xiàng)目,這就非常累贅。

Go給人的印象很深刻,雖然不如D,但是作為一種相對(duì)比較新的語(yǔ)言,已經(jīng)非常不錯(cuò)了。默認(rèn)的PRNG在速度方面有缺陷,所以可改用XorShift。分號(hào)的自由使用是一種很好的體驗(yàn),就作者個(gè)人經(jīng)驗(yàn)而言,它很適合寫(xiě)命令式代碼。

盡管作者花了很長(zhǎng)時(shí)間做優(yōu)化,但是他仍然喜歡Haskell的性能,特別是它必須得攜帶一個(gè)包含一千萬(wàn)整數(shù)的向量。遞歸式編寫(xiě)是一種很棒的改變,而Haskell版本是所測(cè)語(yǔ)言中最簡(jiǎn)明的。

PS:升級(jí)Haskell,用MWC生成器取代Mersenne,速度可達(dá)1.05s。

小結(jié)兩點(diǎn):沒(méi)有運(yùn)行慢的語(yǔ)言,只有優(yōu)化不到位的匯編;如果不需要加密級(jí)別的隨機(jī)性,那么XorShift是速度性能最卓越的PRNG運(yùn)算法則。

——原文參考:Benchmarking level generation: Go, Rust, Haskell and D (and now Scala).

接著Solidot上面所說(shuō)的,C/C++已經(jīng)統(tǒng)治系統(tǒng)編程很久,除了ObjectiveC之外語(yǔ)言都無(wú)法獲得很高的關(guān)注!那么為什么說(shuō)C語(yǔ)言是系統(tǒng)級(jí)編程的首選?

下面我們摘自知乎上張泊寧回答的這個(gè)問(wèn)題很有很有見(jiàn)解,引用至此分享給大家:

第一, C 語(yǔ)言編譯出來(lái)的代碼執(zhí)行效率高。Java 是編譯出來(lái)的是字節(jié)碼而不是計(jì)算機(jī)可直接讀的指令,執(zhí)行時(shí)候還要再翻譯一遍。雖說(shuō)這個(gè)翻譯過(guò)程還是很快的,但對(duì)于性能要求比較高的系統(tǒng)級(jí)軟件仍然是效率優(yōu)先,不能使用類似 Java, C# 編譯出的字節(jié)碼程序。

第二,C語(yǔ)言的指針功能非常強(qiáng)大,一些像樹(shù)、表這樣的數(shù)據(jù)結(jié)構(gòu)離開(kāi)指針可謂寸步難行。而且指針操作非常高效。 但指針操作對(duì)于程序員來(lái)說(shuō)很容易在使用中出錯(cuò),因此 Java 不支持指針。再加上上面說(shuō)的效率問(wèn)題,所以沒(méi)有指針的 Java 不能用來(lái)編寫(xiě)系統(tǒng)級(jí)應(yīng)用。

第三,使用 C語(yǔ)言編寫(xiě)的程序可以非常方便地移植到另一套指令系統(tǒng)的計(jì)算機(jī)上。參見(jiàn) Unix 和 Linux.

為什么不用效率更高的匯編語(yǔ)言?因?yàn)橛脜R編語(yǔ)言編寫(xiě)程序極其費(fèi)時(shí)費(fèi)力,而且不便移植。所以大多數(shù)情況下用的是嵌入式匯編,即高級(jí)語(yǔ)言程序內(nèi)部對(duì)于時(shí)間或空間要求非常苛刻的一段使用匯編語(yǔ)言書(shū)寫(xiě),但整個(gè)程序仍以如 C 這樣的高級(jí)語(yǔ)言為主。況且匯編語(yǔ)言是跟指令系統(tǒng)緊密聯(lián)系在一起的,不方便移植。


當(dāng)前文章:系統(tǒng)級(jí)編程語(yǔ)言性能大PK D語(yǔ)言成首選
標(biāo)題來(lái)源:http://www.5511xx.com/article/cdsjcjo.html