欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語言cpu優(yōu)化,go 編譯優(yōu)化

為什么 Go 語言的性能還不如java

Go語言自亮相以來并沒有展示一個明確的方向,Google員工將Go語言稱為一個“試驗性語言”,稱其試圖融合Python等動態(tài)語言的開發(fā)速度和C或C++等編譯語言的性能和安全。一位Go語言的支持者概括而言Go語言如下:簡單、快速、安全、并發(fā)、快樂編程、開源;但Go語言缺乏方向以及其“集大成者”的嘗試很容易會導(dǎo)致其學(xué)貓不成學(xué)狗也不成,淪為四不像。盡管如此,編者仍然覺得Go語言有相當(dāng)大的潛力:很多開發(fā)者對它感興趣——不僅它的最初設(shè)計者陣容強大,而且在參與修改源代碼的人群中也不乏大牛級人物。這很有可能幫助Go語言找到適合自己的方向,開拓系統(tǒng)編程的新方向。

站在用戶的角度思考問題,與客戶深入溝通,找到永仁網(wǎng)站設(shè)計與永仁網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋永仁地區(qū)。

為什么要使用 Go 語言?Go 語言的優(yōu)勢在哪里

1、學(xué)習(xí)曲線

它包含了類C語法、GC內(nèi)置和工程工具。這一點非常重要,因為Go語言容易學(xué)習(xí),所以一個普通的大學(xué)生花一個星期就能寫出來可以上手的、高性能的應(yīng)用。在國內(nèi)大家都追求快,這也是為什么國內(nèi)Go流行的原因之一。

2、效率

Go擁有接近C的運行效率和接近PHP的開發(fā)效率,這就很有利的支撐了上面大家追求快速的需求。

3、出身名門、血統(tǒng)純正

之所以說Go語言出身名門,是因為我們知道Go語言出自Google公司,這個公司在業(yè)界的知名度和實力自然不用多說。Google公司聚集了一批牛人,在各種編程語言稱雄爭霸的局面下推出新的編程語言,自然有它的戰(zhàn)略考慮。而且從Go語言的發(fā)展態(tài)勢來看,Google對它這個新的寵兒還是很看重的,Go自然有一個良好的發(fā)展前途。我們看看Go語言的主要創(chuàng)造者,血統(tǒng)純正這點就可見端倪了。

4、組合的思想、無侵入式的接口

Go語言可以說是開發(fā)效率和運行效率二者的完美融合,天生的并發(fā)編程支持。Go語言支持當(dāng)前所有的編程范式,包括過程式編程、面向?qū)ο缶幊桃约昂瘮?shù)式編程。

5、強大的標(biāo)準(zhǔn)庫

這包括互聯(lián)網(wǎng)應(yīng)用、系統(tǒng)編程和網(wǎng)絡(luò)編程。Go里面的標(biāo)準(zhǔn)庫基本上已經(jīng)是非常穩(wěn)定,特別是我這里提到的三個,網(wǎng)絡(luò)層、系統(tǒng)層的庫非常實用。

6、部署方便

我相信這一點是很多人選擇Go的最大理由,因為部署太方便,所以現(xiàn)在也有很多人用Go開發(fā)運維程序。

7、簡單的并發(fā)

它包含降低心智的并發(fā)和簡易的數(shù)據(jù)同步,我覺得這是Go最大的特色。之所以寫正確的并發(fā)、容錯和可擴展的程序如此之難,是因為我們用了錯誤的工具和錯誤的抽象,Go可以說這一塊做的相當(dāng)簡單。

8、穩(wěn)定性

Go擁有強大的編譯檢查、嚴(yán)格的編碼規(guī)范和完整的軟件生命周期工具,具有很強的穩(wěn)定性,穩(wěn)定壓倒一切。那么為什么Go相比于其他程序會更穩(wěn)定呢?這是因為Go提供了軟件生命周期的各個環(huán)節(jié)的工具,如go

tool、gofmt、go test。

Go語言中恰到好處的內(nèi)存對齊

在開始之前,希望你計算一下 Part1 共占用的大小是多少呢?

輸出結(jié)果:

這么一算, Part1 這一個結(jié)構(gòu)體的占用內(nèi)存大小為 1+4+1+8+1 = 15 個字節(jié)。相信有的小伙伴是這么算的,看上去也沒什么毛病

真實情況是怎么樣的呢?我們實際調(diào)用看看,如下:

輸出結(jié)果:

最終輸出為占用 32 個字節(jié)。這與前面所預(yù)期的結(jié)果完全不一樣。這充分地說明了先前的計算方式是錯誤的。為什么呢?

在這里要提到 “內(nèi)存對齊” 這一概念,才能夠用正確的姿勢去計算,接下來我們詳細(xì)的講講它是什么

有的小伙伴可能會認(rèn)為內(nèi)存讀取,就是一個簡單的字節(jié)數(shù)組擺放

上圖表示一個坑一個蘿卜的內(nèi)存讀取方式。但實際上 CPU 并不會以一個一個字節(jié)去讀取和寫入內(nèi)存。相反 CPU 讀取內(nèi)存是 一塊一塊讀取 的,塊的大小可以為 2、4、6、8、16 字節(jié)等大小。塊大小我們稱其為 內(nèi)存訪問粒度 。如下圖:

在樣例中,假設(shè)訪問粒度為 4。 CPU 是以每 4 個字節(jié)大小的訪問粒度去讀取和寫入內(nèi)存的。這才是正確的姿勢

另外作為一個工程師,你也很有必要學(xué)習(xí)這塊知識點哦 :)

在上圖中,假設(shè)從 Index 1 開始讀取,將會出現(xiàn)很崩潰的問題。因為它的內(nèi)存訪問邊界是不對齊的。因此 CPU 會做一些額外的處理工作。如下:

從上述流程可得出,不做 “內(nèi)存對齊” 是一件有點 "麻煩" 的事。因為它會增加許多耗費時間的動作

而假設(shè)做了內(nèi)存對齊,從 Index 0 開始讀取 4 個字節(jié),只需要讀取一次,也不需要額外的運算。這顯然高效很多,是標(biāo)準(zhǔn)的 空間換時間 做法

在不同平臺上的編譯器都有自己默認(rèn)的 “對齊系數(shù)”,可通過預(yù)編譯命令 #pragma pack(n) 進行變更,n 就是代指 “對齊系數(shù)”。一般來講,我們常用的平臺的系數(shù)如下:

另外要注意,不同硬件平臺占用的大小和對齊值都可能是不一樣的。因此本文的值不是唯一的,調(diào)試的時候需按本機的實際情況考慮

輸出結(jié)果:

在 Go 中可以調(diào)用 unsafe.Alignof 來返回相應(yīng)類型的對齊系數(shù)。通過觀察輸出結(jié)果,可得知基本都是 2^n ,最大也不會超過 8。這是因為我手提(64 位)編譯器默認(rèn)對齊系數(shù)是 8,因此最大值不會超過這個數(shù)

在上小節(jié)中,提到了結(jié)構(gòu)體中的成員變量要做字節(jié)對齊。那么想當(dāng)然身為最終結(jié)果的結(jié)構(gòu)體,也是需要做字節(jié)對齊的

接下來我們一起分析一下,“它” 到底經(jīng)歷了些什么,影響了 “預(yù)期” 結(jié)果

在每個成員變量進行對齊后,根據(jù)規(guī)則 2,整個結(jié)構(gòu)體本身也要進行字節(jié)對齊,因為可發(fā)現(xiàn)它可能并不是 2^n ,不是偶數(shù)倍。顯然不符合對齊的規(guī)則

根據(jù)規(guī)則 2,可得出對齊值為 8。現(xiàn)在的偏移量為 25,不是 8 的整倍數(shù)。因此確定偏移量為 32。對結(jié)構(gòu)體進行對齊

Part1 內(nèi)存布局:axxx|bbbb|cxxx|xxxx|dddd|dddd|exxx|xxxx

通過本節(jié)的分析,可得知先前的 “推算” 為什么錯誤?

是因為實際內(nèi)存管理并非 “一個蘿卜一個坑” 的思想。而是一塊一塊。通過空間換時間(效率)的思想來完成這塊讀取、寫入。另外也需要兼顧不同平臺的內(nèi)存操作情況

在上一小節(jié),可得知根據(jù)成員變量的類型不同,其結(jié)構(gòu)體的內(nèi)存會產(chǎn)生對齊等動作。那假設(shè)字段順序不同,會不會有什么變化呢?我們一起來試試吧 :-)

輸出結(jié)果:

通過結(jié)果可以驚喜的發(fā)現(xiàn),只是 “簡單” 對成員變量的字段順序進行改變,就改變了結(jié)構(gòu)體占用大小

接下來我們一起剖析一下 Part2 ,看看它的內(nèi)部到底和上一位之間有什么區(qū)別,才導(dǎo)致了這樣的結(jié)果?

符合規(guī)則 2,不需要額外對齊

Part2 內(nèi)存布局:ecax|bbbb|dddd|dddd

通過對比 Part1 和 Part2 的內(nèi)存布局,你會發(fā)現(xiàn)兩者有很大的不同。如下:

仔細(xì)一看, Part1 存在許多 Padding。顯然它占據(jù)了不少空間,那么 Padding 是怎么出現(xiàn)的呢?

通過本文的介紹,可得知是由于不同類型導(dǎo)致需要進行字節(jié)對齊,以此保證內(nèi)存的訪問邊界

那么也不難理解,為什么 調(diào)整結(jié)構(gòu)體內(nèi)成員變量的字段順序 就能達(dá)到縮小結(jié)構(gòu)體占用大小的疑問了,是因為巧妙地減少了 Padding 的存在。讓它們更 “緊湊” 了。這一點對于加深 Go 的內(nèi)存布局印象和大對象的優(yōu)化非常有幫

網(wǎng)站名稱:go語言cpu優(yōu)化,go 編譯優(yōu)化
標(biāo)題URL:http://chinadenli.net/article20/dsedejo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器網(wǎng)站制作動態(tài)網(wǎng)站網(wǎng)站建設(shè)網(wǎng)站導(dǎo)航做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名