golang slice效能分析
golang在gc這塊的做得比較弱,頻繁地申請和釋放記憶體會消耗很多的資源。另外slice使用陣列實現,有一個容量和長度的問題,當slice的容量用完再繼續新增元素時需要擴容,而這個擴容會把申請新的空間,把老的內容複製到新的空間,這是一個非常耗時的操作。有兩種方式可以減少這個問題帶來的效能開銷:
- 在slice初始化的時候設定capacity(但更多的時候我們可能並不知道capacity的大小)
- 複用slice
下面就針對這兩個優化設計瞭如下的benchmark,程式碼在: https://github.com/hatlonely/hellogolang/blob/master/internal/buildin/slice_test.go
BenchmarkAppendWithoutCapacity-8 100 21442390 ns/op
BenchmarkAppendWithCapLessLen10th-8 100 18579700 ns/op
BenchmarkAppendWithCapLessLen3th-8 100 13867060 ns/op
BenchmarkAppendWithCapEqualLen-8 200 6287940 ns/op
BenchmarkAppendWithCapGreaterLen10th-8 100 18692880 ns/op
BenchmarkAppendWithoutCapacityReuse-8 300 5014320 ns/op
BenchmarkAppendWithCapEqualLenReuse-8 300 4821420 ns/op
BenchmarkAppendWithCapGreaterLen10thReuse-8 300 4903230 ns/op
主要結論:
- 在已知 capacity 的情況下,直接設定 capacity 減少記憶體的重新分配,有效提高效能
- capacity < length,capacity越接近length,效能越好
- capacity > lenght,如果太大,反而會造成效能下降,這裡當capacity > 10 * length時,與不設定capacity的效能差不太多
- 多次使用複用同一塊記憶體能有效提高效能
相關文章
- Golang Slice技巧Golang
- golang slice相關常見的效能最佳化手段Golang
- golang json 效能分析GolangJSON
- golang slice 和 string 重用Golang
- Golang效能分析與優化Golang優化
- Golang slice 從原始碼來理解Golang原始碼
- golang 之slice 變長陣列Golang陣列
- go(golang)之slice的小想法1Golang
- golang中切片slice的引用問題Golang
- golang-切片slice的基本介紹Golang
- golang 效能調優分析工具 pprof (上)Golang
- golang 效能調優分析工具 pprof(下)Golang
- Golang 陣列和切片 Slice 和 Map 使用Golang陣列
- Golang 切片(Slice)底層原始碼閱讀Golang原始碼
- [golang]slice的坑:從append到共享GolangAPP
- golang 效能優化分析:benchmark 結合 pprofGolang優化
- Rust的Vector vs. Golang的Slice比較RustGolang
- golang使用sqlx報錯:unsupported type []interface {}, a slice of interfaceGolangSQL
- golang slice使用不慎導致的問題Golang
- golang 使用pprof和go-torch做效能分析Golang
- 每日原始碼分析 – lodash(slice.js)原始碼JS
- 分析go中slice的奇怪現象Go
- 每日原始碼分析 - lodash(slice.js)原始碼JS
- Golang逃逸分析Golang
- 在Golang中使用泛型從任何map中獲取鍵的sliceGolang泛型
- Golang net/http 效能優化GolangHTTP優化
- Golang 效能測試 (3) 跟蹤刨析 golang traceGolang
- 用pprof分析map和slice的記憶體呼叫記憶體
- 樂天收購美國網購資料分析公司Slice
- slice 物件物件
- jQuery slice()jQuery
- Golang效能最佳化實踐Golang
- Golang CLOSE WAIT 分析GolangAI
- golang物件導向分析Golang物件
- Golang pprof 效能調優實戰,效能提升 3 倍!Golang
- 整明白 Golang slice 宣告方式、淺複製現象、深複製、append操作GolangAPP
- 效能分析
- Go 之基礎速學 (十六) golang 裡面的 slice 切片 查詢返回實際集合Golang