golang slice 與list 的效能分析。

2022-02-26 22:34:00 字數 1925 閱讀 9600

一 · 比較slice 與 list 遍歷建立和新增元素速度。

package main

import (

"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 main

import (

"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 main

import (

"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...