自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go Slice 里面放 Struct,應(yīng)該使用指針嗎?

開發(fā) 后端
很多人寫go 也寫了好多年了,但還是對(duì)go 的內(nèi)存結(jié)構(gòu)一無所知,除了內(nèi)存對(duì)齊以外,比如slice 里面到底應(yīng)該放結(jié)構(gòu)體([]MyStruct)還是結(jié)構(gòu)體指針([]*MyStruct),還是一頭霧水。

 

很多人寫go 也寫了好多年了,但還是對(duì)go 的內(nèi)存結(jié)構(gòu)一無所知,除了內(nèi)存對(duì)齊以外,比如slice 里面到底應(yīng)該放結(jié)構(gòu)體([]MyStruct)還是結(jié)構(gòu)體指針([]*MyStruct),還是一頭霧水。

Go slice 里面放struct 應(yīng)該使用指針嗎?

我們先通過一個(gè)性能測(cè)試,看一下這兩種情況下的性能對(duì)比:

我們先定義一個(gè)結(jié)構(gòu)體:

  1. type MyStruct struct { 
  2.     A int 
  3.     B int 

然后通過go自帶的benchmark測(cè)試一下,首先是使用指針的場(chǎng)景:

  1. func BenchmarkSlicePointers(b *testing.B) { 
  2.         b.ReportAllocs() 
  3.     for i := 0; i < b.N; i++ { 
  4.         slice := make([]*MyStruct, 0, 100) 
  5.         for j := 0; j < 100; j++ { 
  6.             slice = append(slice, &MyStruct{A: j, B: j + 1}) 
  7.         } 
  8.     } 

然后是直接放結(jié)構(gòu)體的場(chǎng)景:

  1. func BenchmarkSliceNoPointers(b *testing.B) { 
  2.     b.ReportAllocs() 
  3.     for i := 0; i < b.N; i++ { 
  4.         slice := make([]MyStruct, 0, 100) 
  5.         for j := 0; j < 100; j++ { 
  6.             slice = append(slice, MyStruct{A: j, B: j + 1}) 
  7.         } 
  8.     } 

跑一下:

  1. name               time/op 
  2. SlicePointers-8    2.50µs ± 2% 
  3. SliceNoPointers-8   117ns ± 1% 
  4. name               alloc/op 
  5. SlicePointers-8    1.60kB ± 0% 
  6. SliceNoPointers-8   0.00B      
  7. name               allocs/op 
  8. SlicePointers-8       100 ± 0% 
  9. SliceNoPointers-8    0.00 

可以看到使用指針的時(shí)候的性能要明顯低于直接使用結(jié)構(gòu)體,原因也很明顯,因?yàn)槭褂弥羔樀臅r(shí)候,切面里面放的是指針,指針在單獨(dú)指向一個(gè)內(nèi)存區(qū)域,而直接使用結(jié)構(gòu)體則可以節(jié)省這部分的開銷。

所以,只有我們需要修改原來數(shù)據(jù),必須指針傳遞的時(shí)候,我們才將指針放到slice里面,這點(diǎn)希望大家注意。

 

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2021-08-02 07:57:02

Struct指針函數(shù)

2023-03-13 13:36:00

Go擴(kuò)容切片

2023-03-06 08:01:25

structGo語言

2022-02-09 16:02:26

Go 語言ArraySlice

2017-08-31 11:28:47

Slice底層實(shí)現(xiàn)

2023-07-31 08:00:19

2021-07-08 23:53:44

Go語言拷貝

2024-10-09 08:54:31

2023-11-28 11:44:54

Go切片

2012-06-15 09:56:40

2017-10-20 14:46:26

深度學(xué)習(xí)復(fù)數(shù)噪聲

2017-10-09 14:51:15

深度學(xué)習(xí)復(fù)數(shù)實(shí)數(shù)

2020-11-23 14:22:17

代碼Go存儲(chǔ)

2021-09-27 22:49:13

GoC 指針

2021-04-13 07:58:42

Go語言函數(shù)

2019-12-10 13:55:10

Go指針存儲(chǔ)

2021-08-30 08:23:34

Go語言進(jìn)程

2023-10-26 11:19:21

指針Go

2021-05-14 08:58:18

非線性安全Go

2022-11-26 00:22:14

引用類型數(shù)組
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)