go slice不同初始化方式性能及數(shù)組比較詳解
正文
go語言開發(fā)中,slice是我們常用的數(shù)據(jù)類型之一,也是因?yàn)樗撵`活性,自己也很少使用數(shù)組,當(dāng)然我也知道它的一些特性,不過沒有真實(shí)的去驗(yàn)證它,因?yàn)榇蠖鄶?shù)使用場景沒必要對code太過苛刻,但是如果封裝作為包為其他邏輯提供使用的時候,我覺得還是要在意這些事的,畢竟作為公共包使用時,也就證明了使用的頻率的頻繁性。那么有些事還是指的記錄一下,上周閑來無事跑一下吧,今天做一下記錄
各種場景代碼
其實(shí)我們也都知道slice的底層邏輯是一個動態(tài)數(shù)組,創(chuàng)建的方式也略有不同,slice的創(chuàng)建也可以是最簡單make,這就能滿足我們的使用,也可以直接指定他的cap容量,還有最好的做法是聲明它的容量的同時,直接也分配好了它的內(nèi)存。各種場景的代碼如下,已iterator1000次為例測試:
/*
Package main
@Time : 2022/11/25 17:47
@Author : ckx0709
@Remark :
*/
package main
// SliceUseSimple 簡單的初始化
func SliceUseSimple() []int {
is := make([]int, 0)
for i := 0; i < 1000; i++ {
is = append(is, i)
}
return is
}
// SliceUseInitCap 初始化容量
func SliceUseInitCap() []int {
is := make([]int, 0, 1000)
for i := 0; i < 1000; i++ {
is = append(is, i)
}
return is
}
// SliceUseInitFull 初始化容量&分配好內(nèi)存
func SliceUseInitFull() []int {
is := make([]int, 1000, 1000)
for i := 0; i < 1000; i++ {
is[i] = i
}
return is
}
// ArrayUse 數(shù)組
func ArrayUse() []int {
var is [1000]int
for i := 0; i < 1000; i++ {
is[i] = i
}
return is[:]
}使用benchmark測試
$ go test -benchmem -bench=Benchmark* goos: windows goarch: amd64 pkg: go_iteration/other/temp cpu: Intel(R) Core(TM) i5-9400 CPU @ 2.90GHz BenchmarkSliceUseSimple-6 348466 3501 ns/op 25208 B/op 12 allocs/op BenchmarkSliceUseInitCap-6 2190738 548.7 ns/op 0 B/op 0 allocs/op BenchmarkSliceUseInitFull-6 4408171 261.4 ns/op 0 B/op 0 allocs/op BenchmarkArrayUse-6 4483910 262.1 ns/op 0 B/op 0 allocs/op PASS ok go_iteration/other/temp 6.067s
運(yùn)行了3次,數(shù)值偏差不大,就沒必要每次都貼出來了,這樣也就看出了當(dāng)我們使用最簡單的聲明方式&聲明時就先分配好一切的性能相差了十幾倍,并且最簡單聲明方式占用內(nèi)存&分配內(nèi)存的次數(shù)也很多,第二種,只證明好容量&全聲明相比,剛好性能存在一倍的差異,全聲明&數(shù)組的效率基本一致。
以上就是go slice不同初始化方式性能及數(shù)組比較詳解的詳細(xì)內(nèi)容,更多關(guān)于go slice初始化方式性能比較的資料請關(guān)注腳本之家其它相關(guān)文章!
- GO語言的數(shù)組array與切片slice詳解
- go語言中切片Slice與數(shù)組Array對比以及panic:?runtime?error:?index?out?of?range問題解決
- go slice 擴(kuò)容實(shí)現(xiàn)原理源碼解析
- Go Slice進(jìn)行參數(shù)傳遞如何實(shí)現(xiàn)詳解
- GO語言基本類型String和Slice,Map操作詳解
- Go結(jié)構(gòu)體SliceHeader及StringHeader作用詳解
- Go?slice切片make生成append追加copy復(fù)制示例
- go slice 數(shù)組和切片使用區(qū)別示例解析
相關(guān)文章
Go語言中基本數(shù)據(jù)類型的相互轉(zhuǎn)換詳解
Go在不同類型的變量之間賦值時需要顯示轉(zhuǎn)換,不能自動轉(zhuǎn)換。這篇文章主要和大家介紹了Go語言中基本數(shù)據(jù)類型的相互轉(zhuǎn)換,感興趣的小伙伴可以了解一下2022-10-10
golang 對私有函數(shù)進(jìn)行單元測試的實(shí)例
這篇文章主要介紹了golang 對私有函數(shù)進(jìn)行單元測試的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
解決Goland 同一個package中函數(shù)互相調(diào)用的問題
這篇文章主要介紹了解決Goland 同一個package中函數(shù)互相調(diào)用的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
go語言中io操作中的 io.Reader 和 io.Writer的獲取方法
在Go語言中,要進(jìn)行文件io操作,通常需要使用io.Reader或io.Writer對象,獲取這些對象的方法包括使用標(biāo)準(zhǔn)庫中已實(shí)現(xiàn)Read或Write方法的對象,感興趣的可以了解一下2024-10-10
Go?channel結(jié)構(gòu)體源碼和讀寫和關(guān)閉過程詳解
這篇文章主要介紹了Go?channel結(jié)構(gòu)體源碼和讀寫和關(guān)閉過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05

