go slice不同初始化方式性能及数组比较详解

目录
  • 正文
  • 各种场景代码
  • 使用benchmark测试

正文

go语言开发中,slice是我们常用的数据类型之一,也是因为它的灵活性,自己也很少使用数组,当然我也知道它的一些特性,不过没有真实的去验证它,因为大多数使用场景没必要对code太过苛刻,但是如果封装作为包为其他逻辑提供使用的时候,我觉得还是要在意这些事的,毕竟作为公共包使用时,也就证明了使用的频率的频繁性。那么有些事还是指的记录一下,上周闲来无事跑一下吧,今天做一下记录

各种场景代码

其实我们也都知道slice的底层逻辑是一个动态数组,创建的方式也略有不同,slice的创建也可以是最简单make,这就能满足我们的使用,也可以直接指定他的cap容量,还有最好的做法是声明它的容量的同时,直接也分配好了它的内存。各种场景的代码如下,已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 初始化容量&分配好内存
func SliceUseInitFull() []int {
    is := make([]int, 1000, 1000)
    for i := 0; i < 1000; i++ {
        is[i] = i
    }
    return is
}
// ArrayUse 数组
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

运行了3次,数值偏差不大,就没必要每次都贴出来了,这样也就看出了当我们使用最简单的声明方式&声明时就先分配好一切的性能相差了十几倍,并且最简单声明方式占用内存&分配内存的次数也很多,第二种,只证明好容量&全声明相比,刚好性能存在一倍的差异,全声明&数组的效率基本一致。

以上就是go slice不同初始化方式性能及数组比较详解的详细内容,更多关于go slice初始化方式性能比较的资料请关注我们其它相关文章!

(0)

相关推荐

  • GO语言基本类型String和Slice,Map操作详解

    目录 本文大纲 1.字符串String String常用操作:获取长度和遍历 字符串的strings包 字符串的strconv包: 2.切片Slice 3.集合Map 本文大纲 本文继续学习GO语言基础知识点. 1.字符串String String是Go语言的基本类型,在初始化后不能修改,Go字符串是一串固定长度的字符连接起来的字符序列,当然它也是一个字节的切片(Slice). import ("fmt") func main() { name := "Hello World

  • Go结构体SliceHeader及StringHeader作用详解

    目录 引言 SliceHeader 疑问 坑 StringHeader 0 拷贝转换 总结 引言 在 Go 语言中总是有一些看上去奇奇怪怪的东西,咋一眼一看感觉很熟悉,但又不理解其在 Go 代码中的实际意义,面试官却爱问... 今天要给大家介绍的是 SliceHeader 和 StringHeader 结构体,了解清楚他到底是什么,又有什么用,并且会在最后给大家介绍 0 拷贝转换的内容. 一起愉快地开始吸鱼之路. SliceHeader SliceHeader 如其名,Slice + Heade

  • Go Slice进行参数传递如何实现详解

    目录 先了解什么是defer defer 的用法 那么defer 和 return有什么联系? 原因: 更进一步理解 省流小结 先了解什么是defer Go语言中的defer与return执行的先后顺序 Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行.也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行.(与栈的先入后出是一个道理,也可以将其理解为入栈和出栈) 举一

  • Go slice切片make生成append追加copy复制示例

    目录 回顾 加深理解 生成切片 make 更好的理解长度和容量 切片引用类型实战 切片的遍历 append 多次追加 追加多个元素 复制切片 删除元素 数组转切片 实战演练 总结 回顾 上一篇文章我们介绍了切片slice的定义初始化.引用类型特征.如何使用数组切割成切片. 这篇文章介绍切片的生成make().切片的追加append().切片的复制copy().对知识点进行详细介绍和应用实战. 加深理解 切片的本质:切片的本质是一个框,框住了一块连续的内存 切片属于引用类型,真正的数据都是保存在底

  • Go slice切片使用示例详解

    目录 定义 定义并初始化 长度和容量 由数组得到切片 更多切割方式举例 切片的长度和容量 切片再切片 slice是引用类型 总结 定义 切片区别于数组,是引用类型, 不是值类型.数组是固定长度的,而切片长度是可变的,我的理解是:切片是对数组一个片段的引用. var s1 []int //定义一个存放int类型元素的切片 var s2 []string //定义一个存放string类型元素的切片 fmt.Println(s1, s2) fmt.Println(s1 == nil) //true 为

  • go slice不同初始化方式性能及数组比较详解

    目录 正文 各种场景代码 使用benchmark测试 正文 go语言开发中,slice是我们常用的数据类型之一,也是因为它的灵活性,自己也很少使用数组,当然我也知道它的一些特性,不过没有真实的去验证它,因为大多数使用场景没必要对code太过苛刻,但是如果封装作为包为其他逻辑提供使用的时候,我觉得还是要在意这些事的,毕竟作为公共包使用时,也就证明了使用的频率的频繁性.那么有些事还是指的记录一下,上周闲来无事跑一下吧,今天做一下记录 各种场景代码 其实我们也都知道slice的底层逻辑是一个动态数组,

  • javascript中Array()数组函数详解

    在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只能存放同一类型或其子类型元素,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改. Array()是一个用来构建数组的内建构造器函数.数组主要由如下三种创建方式: array = new Array() array =

  • SpringBoot集成本地缓存性能之王Caffeine示例详解

    目录 引言 Spring Cache 是什么 集成 Caffeine 核心原理 引言 使用缓存的目的就是提高性能,今天码哥带大家实践运用 spring-boot-starter-cache 抽象的缓存组件去集成本地缓存性能之王 Caffeine. 大家需要注意的是:in-memeory 缓存只适合在单体应用,不适合与分布式环境. 分布式环境的情况下需要将缓存修改同步到每个节点,需要一个同步机制保证每个节点缓存数据最终一致. Spring Cache 是什么 不使用 Spring Cache 抽象

  • C语言动态内存管理malloc柔性数组示例详解

    目录 1.1为什么存在动态内存管理 1.2动态内存管理函数 1.2.1malloc 1.2.2free 1.2.3calloc 1.2.4realloc 1.3动态内存管理函数易错点 1.3.1对NULL指针的解引用操作 1.3.2对动态开辟空间的越界访问 1.3.3对非动态开辟内存使用free释放 1.3.4使用free释放一块动态开辟内存的一部分 1.3.5对同一块动态内存多次释放 1.3.6动态开辟内存忘记释放(内存泄漏) 2.1常见相关笔试题 2.2C/C++语言中的内存开辟 2.3柔性

  • JS 加载性能Tree Shaking优化详解

    目录 正文 什么是 Tree Shaking 寻找 Tree Shaking 的机会 防止 Babel 将 ES6 模块转换为 CommonJS 模块 留意 side effects 只导入你需要的 更复杂的情况 总结 正文 随着 web 应用复杂性增加,JS 代码文件的大小也在不断的攀升,截住 2021年9月,在 httparchive 上有统计显示——在移动设备上 JS 传输大小大约为 447 KB,桌面端 JS 传输大小大约为 495 KB,注意这仅仅是在网络中传输的 JS 文件大小,JS

  • C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[10]; 指针数组简言之就是存放指针的数组: --数组并非指针&&指针并非数组 (1)定义一个外部变量: eg:int value=10; int *p=&value; 举例:当需要在一个函数中用这个变量时:externa int*p;而非extern int p[]; 分析:当用:e

  • 对pytorch网络层结构的数组化详解

    最近再写openpose,它的网络结构是多阶段的网络,所以写网络的时候很想用列表的方式,但是直接使用列表不能将网络中相应的部分放入到cuda中去. 其实这个问题很简单的,使用moduleList就好了. 1 我先是定义了一个函数,用来根据超参数,建立一个基础网络结构 stage = [[3, 3, 3, 1, 1], [7, 7, 7, 7, 7, 1, 1]] branches_cfg = [[[128, 128, 128, 512, 38], [128, 128, 128, 512, 19]

  • java并发编程专题(十一)----(JUC原子类)数组类型详解

    上一节我们介绍过三个基本类型的原子类,这次我们来看一下数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray.其中前两个的使用方式差不多,AtomicReferenceArray因为他的参数为引用数组,所以跟前两个的使用方式有所不同. 1.AtomicLongArray介绍 对于AtomicLongArray, AtomicIntegerArray我们还是只介绍一个,另一个使用方式大同小异. 我们先来看看AtomicLong

  • MyBatis注解方式之@Update/@Delete使用详解

    @Update 1. RoleMapper接口增加接口方法 /** * * * @Title: updateSysRoleById * * @Description: updateSysRoleById * * @param sysRole * @return * * @return: int */ @Update({ "update sys_role set role_name = #{roleName},enabled = #{enabled},create_by = #{createBy}

  • java数据结构算法稀疏数组示例详解

    目录 一.什么是稀疏数组 二.场景用法 1.二维数组转稀疏数组思路 2.稀疏数组转二维数组思路 3.代码实现 一.什么是稀疏数组 当一个数组a中大部分元素为0,或者为同一个值,那么可以用稀疏数组b来保存数组a. 首先,稀疏数组是一个数组,然后以一种特定的方式来保存上述的数组a,具体处理方法: 记录数组a一共有几行几列 记录a中有多少个不同的值 最后记录不同值的元素所在行列,以及具体的值,放在一个小规模的数组里,以缩小程序的规模. 这个小规模的数组,就是稀疏数组. 举个栗子,左侧是一个二维数组,一

随机推荐