一 · 比較slice 與 list 遍歷建立和新增元素速度。
package mainimport (
"time"
"fmt"
"container/list"
)func main()
fmt.println("slice 建立速度:" + time.now().sub(t).string())
t = time.now()
l:=list.new()
for i := 0; i<1*100000*1000;i++
fmt.println("list 建立速度: " + time.now().sub(t).string())
}
本機執行結果:
宣告:測試結果為個人電腦的測試結果,僅供參考。
slice 建立速度:1.3029245s
list 建立速度: 9.7489181s
對於1億條資料,slice 的建立和新增元素的速度約是list的7~8倍。
二 · 比較list和slice的遍歷速度
package mainimport (
"time"
"fmt"
"container/list"
)func main()
l:=list.new()
for i := 0; i<1*100000*1000;i++
// 比較遍歷
t := time.now()
for _,_ = range sli
fmt.println("遍歷slice的速度:" + time.now().sub(t).string())
t = time.now()
for e := l.front(); e != nil; e = e.next()
fmt.println("遍歷list的速度:" + time.now().sub(t).string())
}
本機執行結果:
遍歷slice的速度:32.0235ms
遍歷list的速度:480.3413ms
對於1億條資料來講slice 遍歷速度約是list的速度的15倍。
三 · 比較list和slice的插入速度
package mainimport (
"time"
"fmt"
"container/list"
)func main()
l:=list.new()
for i := 0; i<1*100000*1000;i++
//比較插入
t := time.now()
slif:=sli[:100000*500]
slib:=sli[100000*500:]
fmt.println("slice 的插入速度" + time.now().sub(t).string())
var em *list.element
len:=l.len()
var i int
for e := l.front(); e != nil; e = e.next()
}//忽略掉找中間元素的速度。
t = time.now()
ef:=l.pushback(2)
l.movebefore(ef,em)
fmt.println("list: " + time.now().sub(t).string())
}
本機執行結果:
slice 的插入速度79.054ms
list 的插入速度 : 0s
list的插入結果約是list 的」無窮」倍……
總結:對於很多資料來講:頻繁的插入和刪除用list,頻繁的遍歷查詢選slice。
golang slice效能分析
golang在gc這塊的做得比較弱,頻繁地申請和釋放記憶體會消耗很多的資源。另外slice使用陣列實現,有乙個容量和長度的問題,當slice的容量用完再繼續新增元素時需要擴容,而這個擴容會把申請新的空間,把老的內容複製到新的空間,這是乙個非常耗時的操作。有兩種方式可以減少這個問題帶來的效能開銷 在s...
golang Slice相關知識
slice 又稱動態陣列,依託陣列實現,可以方便的進行擴容 傳遞等,實際使用中比陣列更靈活。slice依託陣列實現,底層陣列對使用者遮蔽,在底層陣列容量不足時可以實現自動重分配並生成新的slice。接下來按照實際使用場景分別介紹其實現機制。宣告和初始化變數切片主要有以下幾種 內建函式len 和cap...
Golang slice 的底層實現
首先我們來看段 的輸出 s make int,4 for i 0 i 4 i s0 s 0 fmt.println s 輸出的結果是 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 帶著這些疑問,我們來看看slice的底層實現。slice的結構 type slice structar...