首页 > 其他分享 >在Go中map[]bool与map[]struct{}性能对比

在Go中map[]bool与map[]struct{}性能对比

时间:2023-04-23 17:39:07浏览次数:36  
标签:map struct bool 内存 0% Go

image.png

在Go中,map[]struct{}在性能和内存消耗方面比map[]bool更好,时间上快了5%,内存消耗少了10%,尤其是在处理大型集合时。

众所周知,Go语言没有内置Set,因此开发人员使用map来模仿Set的行为。使用map来实现Set意味着map的值不重要,我们只需要关注键的存在。大多数情况下,人们可能会选择bool,因为它是内存消耗最少的类型之一,但在Go中,使用空结构体也是另一种选择。在本文中,我们将对它们进行基准测试,以查看是否有任何差异。

代码示例

为了获取足够的数据进行比较,我们首先声明不同类型的map,然后将其键从0设置到2²⁴-1,观察它需要多长时间和内存来完成。

我们可以使用golang中的内置基准机制来完成此操作。只需要几行代码就可以了:

package main

import (
	"testing"
)

const it = uint(1 << 24)

func BenchmarkSetWithBoolValueWrite(b *testing.B) {
	set := make(map[uint]bool)

	for i := uint(0); i < it; i++ {
		set[i] = true
	}
}

func BenchmarkSetWithStructValueWrite(b *testing.B) {
	set := make(map[uint]struct{})

	for i := uint(0); i < it; i++ {
		set[i] = struct{}{}
	}
}

func BenchmarkSetWithInterfaceValueWrite(b *testing.B) {
	set := make(map[uint]interface{})

	for i := uint(0); i < it; i++ {
		set[i] = struct{}{}
	}
}

map[uint]interface{}是一种预计速度较慢的特殊类型。

由于读取操作对于任何键的性能应该是相似的,因此在这里我们只对写入/设置操作进行基准测试。

以下命令可以生成统计数据:

GOMAXPROCS=1 go test -v -bench=. -count=3 -run=none -benchmem | tee bench.txt
# run `go get -u golang.org/x/perf/cmd/benchstat` if benchstat failed
benchstat bench.txt 

现在让我们来检查结果。

结果

name                        time/op 
SetWithBoolValueWrite        3.27s ± 0% 
SetWithStructValueWrite      3.12s ± 0% 
SetWithInterfaceValueWrite   5.96s ± 0% 
 
name                        alloc/op 
SetWithBoolValueWrite        884MB ± 0% 
SetWithStructValueWrite      802MB ± 0% 
SetWithInterfaceValueWrite  1.98GB ± 0%

从上面的结果来看,与大集合相比,*map[]struct{}*时间快了 5%,内存消耗减少了 10% 。*map[]bool*(使用map[]interface{}是一场灾难,因为它增加了很多开销,几乎使时间和内存增加了一倍。)

结论

虽然map[]struct{}速度更快,内存消耗更少,但在大Set上更明显。因此,如果您赶时间并且资源不是您最关心的问题,那么使用map[]bool应该完全没问题。如果追求极致性能,key的类型是uint,更推荐bitset。

希望你喜欢这篇文章,欢迎点赞、关注、分享。

标签:map,struct,bool,内存,0%,Go
From: https://blog.51cto.com/u_12409319/6218415

相关文章

  • 哈希类型 列表类型 集合类型 有序集合 慢查询 pipeline与事务 发布订阅 Bitmap位图 Hy
    昨日回顾#1redis介绍 -特性#速度快:10wops(每秒10w读写),数据存在内存中,c语言实现,单线程模型#持久化:rdb和aof#多种数据结构:5大数据结构BitMaps位图:布隆过滤器本质是字符串HyperLogLog:超小内存唯一值计数,12kbHyperLogLog本质是......
  • array_map与array_walk的区别
    1、array_map的用法是array_map(函数名,数组),而array_walk的用法是array_walk(数组,函数名);2、array_map里面的函数可以是自定义函数,也可以是php自带的函数,比如trim去除空格等。而array_walk里面的函数只能是自定义的函数3、array_map不可以改变原函数的值,会获取到新的数组。arra......
  • 基于SuperMap iDesktop制作栅格和矢量瓦片
    栅格瓦片的制作与使用 栅格瓦片的生产瓦片地图缓存可以提升客户端地图呈现的显示效率,但是生成瓦片地图缓存也是一项耗费时间的工作。桌面产品生成缓存iServer分布式切图SuperMapUGC缓存SuperMapUGCV5缓存MongoDB分布式存储缓存MongoDB栅格瓦片的制作(一)......
  • nmap工具:一款开源的网络扫描和主机检测工具,可以用于发现计算机系统上运行的端口、服务
    1、nmap是一款开源的网络扫描和主机检测工具,可以用于发现计算机系统上运行的端口、服务以及操作系统等信息。通过nmap的扫描,系统管理员可以获得自己网络环境下的详细情况,包括哪些端口正在监听,哪些服务正在运行等信息,可以在保证网络安全和稳定的前提下优化网络配置,增强网络安全......
  • ConfigMap&Secret场景应用
    一、configMap1.1、概述ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。1.2、作用ConfigM......
  • 《面试1v1》HashMap
    没有人比中国人更懂HashMap我是javapub,一名Markdown程序员从......
  • mapbox-gl实战教程:单图层POI图标多样性
    在地图开发中,POI数据是不可或缺的一部分,各类地名、公共设施、商场超市、政府机构等等,都是地图上的POI数据;在业务系统,还有像摄像头、监测设备等POI数据;这些数据在地图上显示时,会形象地以各种图标形式进行显示,方便进行区分。mapbox-gl支持加载点状数据,并且能够设置点类型显示为图标,......
  • Java 把 Map 的值(Value)转换为 Array, List 或 Set
    概述在这篇短文中,我们将会展示如何把Map中的值取出来,转换为一个Array,、List或者一个Set。 当然,你可以使用JavaJDK来进行转换,你也可以使用Guava来进行转换。 首先,让我们来看看,如何使用原生的JavaJDK把一个Map的值换行为Array。@TestpublicfinalvoidgivenU......
  • Java 把 Map 的值(Value)转换为 Array, List 或 Set
    概述在这篇短文中,我们将会展示如何把Map中的值取出来,转换为一个Array,、List或者一个Set。 当然,你可以使用JavaJDK来进行转换,你也可以使用Guava来进行转换。 首先,让我们来看看,如何使用原生的JavaJDK把一个Map的值换行为Array。@Testpublicfinal......
  • nmap详解
    初识NmapNmap是被专业人员广泛使用的一款功能全面的端口扫描工具。它由Fyodor编写并维护。由于Nmap品质卓越,使用灵活,它已经是渗透测试人员必备的工具。除了端口扫描外,Nmap还具备如下功能:123456789主机探测:Nmap可査找目标网络中的在线主机。默认情况下,Nmap通过......