go slice不同初始化方式性能&数组比较
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不同初始化方式性能&数组比较的更多相关文章
- c语言数组不同初始化方式的结果
第一种初始化方式: #include <stdio.h> int main() { int numbers[5]={12,14}; for (int i=0; i<5; i++) { ...
- Java中数组的初始化方式
Java中数组的初始化方式 初始化方式有两种: 1.静态初始化:初始化时由程序猿显式指定每一个数组元素的初始值,由系统指定数组长度 2.动态初始化:初始化时由程序猿仅仅指定数组长度,由系统为数组 ...
- 出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数 const 编译错误 最小权限原则
#include <stdio.h> int main(void) { char array[5]; printf("array=%p,&array[0]=%p,& ...
- JAVA学习笔记-数组的三种初始化方式
package Study; public class TestArray02 { public static void main(String[] args){//声明 int[] a; int ...
- HashMap优雅的初始化方式以及引申
小记 相信很多人和笔者一样,经常会做一些数组的初始化工作,也肯定会经常用到集合类.假如我现在要初始化一个String类型的数组,可以很方便的使用如下代码: String [] strs = {&quo ...
- C++的各种初始化方式
C++小实验测试:下面程序中main函数里a.a和b.b的输出值是多少? #include <iostream> struct foo { foo() = default; int a; ...
- Java连载66-数组的两种初始化方式
一.数组 1.数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只要知道下标,就可以快速的计算出偏移量,通过首元素内存地址加上偏移量,就 ...
- vector的初始化方式及用法笔记(不断更新)
vector的初始化方式 1)第一种,类似于数组的方式:vector<string> letter(3);letter[0] = "find";letter[1] = ...
- [C#.NET 拾遗补漏]03:你可能不知道的几种对象初始化方式
阅读本文大概需要 1.2 分钟. 随着 C# 的升级,C# 在语法上对对象的初始化做了不少简化,来看看有没有你不知道的. 数组的初始化 在上一篇罗列数组的小知识的时候,其中也提到了数组的初始化,这时直 ...
- [Android]Dagger2Metrics - 测量DI图表初始化的性能(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5098943.html Dagger2Metrics - 测量D ...
随机推荐
- 统一建模语言UML---类图
什么是统一建模语言,来看看百科中的介绍统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明.可视化和编制文档的一种标准语言,是非专利的第三代建模 ...
- 使用Vite快速构建Vue3+ts+pinia脚手架
一.前言 vue3的快速更新,很多IT发展快的地区在22开始都已经提上日程,小编所在的青岛好像最近才有点风波.vue3的人才在青岛还是比较稀缺的哈,纯属小编自己的看法,可能小编是个井底之蛙!! vue ...
- Python数据科学手册-机器学习介绍
机器学习分为俩类: 有监督学习 supervised learning 和 无监督学习 unsupervised learning 有监督学习: 对数据的若干特征与若干标签之间 的关联性 进行建模的过 ...
- 7、System类
System类 常见方法 exit 退出当前程序 System.out.println("ok1"); //1. exit(0) 表示程序退出 //2. 0 表示一个状态,正常的状 ...
- k8s 如何关联pvc到特定的pv
可以使用对 pv 打 label 的方式,具体如下: 创建 pv,指定 label $ cat nfs-pv2.yaml apiVersion: v1 kind: PersistentVolume # ...
- service服务使用CoreDNS提供的域名地址访问
普通的 Service:会生成 servicename.namespace.svc.cluster.local 的域名,会解析到 Service 对应的 ClusterIP 上,在 Pod 之间的调用 ...
- 从Kubernetes Event中提取有效信息
- haproxy + keeplived
两台主机: 192.168.2.163 192.168.2.165 # yum安装haproxy yum install haproxy # cat /etc/haproxy/haproxy.cfg ...
- Compass- 图形化界面客户端
到MongoDB官网下载MongoDB Compass, 地址: https://www.mongodb.com/download-center/v2/compass?initial=true 如果是 ...
- Java泛型的总结
泛型可以用于接口.类.方法上.还有泛型通配符这个概念 泛型的好处:可以在编译时检查 1.用于方法中,指定该方法中的形参的类型. 语法:修饰符 <代表泛型的变量> 返回值类型 方法名(参数) ...