第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

golang切片分配性能

golang切片分配性能

Go
守著一只汪 2021-12-27 15:13:14
在檢查 GO 中內(nèi)存分配的性能時(shí),我偶然發(fā)現(xiàn)了一件有趣的事情。package mainimport (      "fmt"      "time"    )func main(){   const alloc int = 65536   now := time.Now()   loop := 50000   for i := 0; i<loop;i++{      sl := make([]byte, alloc)      i += len(sl) * 0   }   elpased := time.Since(now)   fmt.Printf("took %s to allocate %d bytes %d times", elpased, alloc, loop) }我在 Core-i7 2600 上運(yùn)行它,Go 版本為 1.6 64 位(在 32 位上也有相同的結(jié)果)和 16GB 的 RAM(在 WINDOWS 10 上),所以當(dāng) alloc 是 65536(正好是 64K)時(shí),它會(huì)運(yùn)行 30 秒(!?。。?! )。當(dāng) alloc 為 65535 時(shí),大約需要 200 毫秒。有人可以向我解釋一下嗎?我在家里用我的核心 i7-920 @ 3.8GHZ 嘗試了相同的代碼,但它沒有顯示相同的結(jié)果(兩者都花了大約 200 毫秒)。任何人都知道發(fā)生了什么?
查看完整描述

3 回答

?
長風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊

設(shè)置 GOGC=off 提高了性能(降低到小于 100 毫秒)。為什么?因?yàn)?a >逃逸分析。當(dāng)您使用go build -gcflags -m編譯器構(gòu)建時(shí),會(huì)打印任何逃逸到堆的分配。這實(shí)際上取決于您的機(jī)器和 GO 編譯器版本,但是當(dāng)編譯器決定分配應(yīng)該移到堆時(shí),這意味著兩件事:1. 分配將花費(fèi)更長的時(shí)間(因?yàn)槎褩I系摹胺峙洹敝皇?1 個(gè) cpu 指令)2. GC 稍后將不得不清理該內(nèi)存 - 為我的機(jī)器花費(fèi)更多的 CPU 時(shí)間,65536 字節(jié)的分配轉(zhuǎn)義到堆,而 65535 則不會(huì)。這就是為什么 1 個(gè)字節(jié)將整個(gè)過程從 200 毫秒更改為 30 秒的原因。驚人..


查看完整回答
反對 回復(fù) 2021-12-27
?
慕森卡

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊

注意/2021 年更新:正如Tapir Liui在Go101中用這條推文指出的那樣:


從 Go 1.17 開始,如果編譯器證明它們僅在當(dāng)前 goroutine 中使用,并且Go 運(yùn)行時(shí)將在堆棧上分配slice 的元素:xN <= 64KB


var x = make([]byte, N)

如果編譯器證明它僅用于當(dāng)前 goroutine并且 Go 運(yùn)行時(shí)將在堆棧上分配數(shù)組 :yN <= 10MB


var y [N]byte

那么如何分配的(的元素)片,其尺寸大于64KB上堆疊更大但不大于10MB(和切片僅在一個(gè)夠程中使用)?


只需使用以下方式:


var y [N]byte

var x = y[:]

考慮到堆棧分配比堆分配快,這將對您的測試產(chǎn)生直接影響,因?yàn)閍lloc等于 65536 或更多。


貘補(bǔ)充說:


事實(shí)上,我們可以在堆棧上分配具有任意總和元素大小的切片。


const N = 500 * 1024 * 1024 // 500M

var v byte = 123


func createSlice() byte {

 var s = []byte{N: 0}

 for i := range s { s[i] = v }

 return s[v]

}

將 500 更改為 512 會(huì)使程序崩潰。


查看完整回答
反對 回復(fù) 2021-12-27
?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊

原因很簡單。

const alloc int = 65535

0x0000 00000 (example.go:8)     TEXT    "".main(SB), ABIInternal, $65784-0

const alloc int = 65536

0x0000 00000 (example.go:8)     TEXT    "".main(SB), ABIInternal, $248-0

不同之處在于切片的創(chuàng)建位置。


查看完整回答
反對 回復(fù) 2021-12-27
  • 3 回答
  • 0 關(guān)注
  • 259 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)