Golang中slice删除元素的性能对比
作者:qishuai 发布时间:2024-05-05 09:33:03
在我写的blog中,这个算是参与度比较高的,所以有必要把程序写的更加容易理解一些。
我的电脑配置:
? bechmark system_profiler SPHardwareDataType
Hardware:Hardware Overview:
Model Name: MacBook Pro
Model Identifier: MacBookPro14,1
Processor Name: Dual-Core Intel Core i5
Processor Speed: 2.3 GHz
Number of Processors: 1
Total Number of Cores: 2
L2 Cache (per Core): 256 KB
L3 Cache: 4 MB
Hyper-Threading Technology: Enabled
Memory: 8 GB
Boot ROM Version: 428.0.0.0.0
SMC Version (system): 2.43f10
直接上代码:
package bechmark
import (
"testing"
)
var (
// 原始slice
origin = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
// 需要删除的元素
targetEle = 6
)
// 第一种
func BenchmarkMake(t *testing.B) {
t.ResetTimer()
for i := 0; i < t.N; i++ {
target := make([]int, 0, len(origin))
for _, item := range origin {
if item != targetEle {
target = append(target, item)
}
}
}
}
// 第二种
func BenchmarkReuse(t *testing.B) {
t.ResetTimer()
for i := 0; i < t.N; i++ {
target := origin[:0]
for _, item := range origin {
if item != targetEle {
target = append(target, item)
}
}
}
}
// 第三种
func BenchmarkEditOne(t *testing.B) {
t.ResetTimer()
for i := 0; i < t.N; i++ {
for i := 0; i < len(origin); i++ {
if origin[i] == targetEle {
origin = append(origin[:i], origin[i+1:]...)
i-- // maintain the correct index
}
}
}
}
Benchmark结果:
? bechmark go test -v -bench=. -benchtime=3s -benchmem
goos: darwin
goarch: amd64
pkg: test/bechmark
BenchmarkMake-4 95345845 35.8 ns/op 80 B/op 1 allocs/op
BenchmarkReuse-4 255912920 14.4 ns/op 0 B/op 0 allocs/op
BenchmarkEditOne-4 473434452 7.56 ns/op 0 B/op 0 allocs/op
PASS
ok test/bechmark 12.915s
解释:
除了第一种方法外,其他方法都对原数据进行了修改;
第一种方法适合不污染原slice数据的情况下使用,这种方式也比较简单,大部分学习golang的人也都能想到,不过性能稍差一些,还存在内存分配情况,不过也要看业务需要;
第二种方法比较巧妙,也是看到一个大神写的,创建了一个slice,但是共用原始slice的底层数组;这样就不需要额外分配内存空间,直接在原数据上进行修改。
第三种方法也会对底层数组进行修改,思路和前两种正好相反,如果找到需要移除的元素的时候,将其之后的元素前移,覆盖该元素的位置。
来源:https://www.jianshu.com/p/d276aa7300d1


猜你喜欢
- <html><head><meta http-equiv="Content-Type" c
- 前言夏天是用来告别的季节,因为毕业总在七月。那么七月之前的季节是用来干嘛的呢?当然是用来做毕业设计的啦今天还是写一些从简单到难的毕业设计或者
- MySQL 非空约束(NOT NULL)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。可
- 初学python,看来零零碎碎的格式化文本的方法,总结一下python中格式化文本的方法。使用不当的地欢迎指出谢谢。1、首先看使用%格式化文
- MySQL是关系型数据库中的明星,MongoDB是文档型数据库中的翘楚。下面通过一个设计实例对比一下二者:假设我们正在维护一个手机产品库,里
- 『写在前面』以CTC Beam search decoder为例,简单整理一下TensorFlow实现自定义Op的操作流程。基本的流程1.
- 本文实例讲述了Python自定义函数实现求两个数最大公约数、最小公倍数。分享给大家供大家参考,具体如下:1. 求最小公倍数的算法:最小公倍数
- 本文实例讲述了JavaScript内置对象math,global功能与用法。分享给大家供大家参考,具体如下:学习要点:1.Global对象2
- 之前使用smarty的时候,通常是在php程序端读取数据(一般从数据库),然后assign给模板的变量,才可以在前端使用这个变量。这样不是不
- 涉及到详情页爬取目录结构:kaoshi_bqg.pyimport scrapyfrom scrapy.spiders import Rule
- 问题概述:有时候在使用print函数输出时,往往需要不断地切换字符串和变量,操作起来很不方便,需要不断地打引号和逗号。比如:firstNam
- 一、MatplotlibMatplotlib是Python中众多数据可视化库的鼻祖,其设计风格与20世纪80年代设计的商业化程序语言MATL
- 问题定义一个int型的一维数组,包含40个元素,用来存储每个学员的成绩,循环产生40个0~100之间的随机整数,(1)将它们存储到一维数组中
- 最近在D4得到一本(美) Penny Mcintire写的《Visual Design for the Modern Web》.突然觉得可用
- 前言:Python 面向对象的高级编程语言,以其语法简单、免费开源、免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方
- 前言使用np.savetxt()方法可以将数据保存为txt文件或者是csv文件。1 np.savetxt()存储txt文件1-1 基础参数n
- 图像文件是自己仿照mnist格式制作,每张图像大小为128*128import structimport matplotlib.pyplot
- VueX浏览器刷新保存数据在vue项目中用vuex来做全局的状态管理, 发现当刷新网页后,保存在vuex实例store里的数据会丢失。原因:
- pytorch中如何只让指定变量向后传播梯度?(或者说如何让指定变量不参与后向传播?)有以下公式,假如要让L对xvar求导:(1)中,L对x
- views.py中的修改增加相应的请求处理函数:def getdevjson(request): print 'get here