網(wǎng)站首頁 編程語言 正文
正文
go語言開發(fā)中,slice是我們常用的數(shù)據(jù)類型之一,也是因?yàn)樗撵`活性,自己也很少使用數(shù)組,當(dāng)然我也知道它的一些特性,不過沒有真實(shí)的去驗(yàn)證它,因?yàn)榇蠖鄶?shù)使用場(chǎng)景沒必要對(duì)code太過苛刻,但是如果封裝作為包為其他邏輯提供使用的時(shí)候,我覺得還是要在意這些事的,畢竟作為公共包使用時(shí),也就證明了使用的頻率的頻繁性。那么有些事還是指的記錄一下,上周閑來無事跑一下吧,今天做一下記錄
各種場(chǎng)景代碼
其實(shí)我們也都知道slice的底層邏輯是一個(gè)動(dòng)態(tài)數(shù)組,創(chuàng)建的方式也略有不同,slice的創(chuàng)建也可以是最簡(jiǎn)單make,這就能滿足我們的使用,也可以直接指定他的cap容量,還有最好的做法是聲明它的容量的同時(shí),直接也分配好了它的內(nèi)存。各種場(chǎng)景的代碼如下,已iterator1000次為例測(cè)試:
/* Package main @Time : 2022/11/25 17:47 @Author : ckx0709 @Remark : */ package main // SliceUseSimple 簡(jiǎn)單的初始化 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測(cè)試
$ 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)我們使用最簡(jiǎn)單的聲明方式&聲明時(shí)就先分配好一切的性能相差了十幾倍,并且最簡(jiǎn)單聲明方式占用內(nèi)存&分配內(nèi)存的次數(shù)也很多,第二種,只證明好容量&全聲明相比,剛好性能存在一倍的差異,全聲明&數(shù)組的效率基本一致。
原文鏈接:https://www.cnblogs.com/ckxlovejava/p/16931501.html
相關(guān)推薦
- 2022-07-09 Jquery使用AJAX方法請(qǐng)求數(shù)據(jù)_jquery
- 2022-06-14 Flutter?RSA加密解密的示例代碼_Android
- 2022-12-24 一文帶你輕松學(xué)會(huì)Go語言動(dòng)態(tài)調(diào)用函數(shù)_Golang
- 2023-10-14 uniapp 將base64字符串保存為圖片、Word、Excel、音頻、視頻等文件
- 2022-06-29 C++詳細(xì)講解IO流原理_C 語言
- 2022-11-17 C++11中異常處理機(jī)制詳解_C 語言
- 2022-12-26 React開發(fā)進(jìn)階redux?saga使用原理詳解_React
- 2022-08-15 BufferedInputStream與FileInputStream的區(qū)別
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支