golang的syncMap写入性能差的原因

golang sync.Map 原理以及性能分析 go sync.Map 原理分析 go mapsync.Map数据结构 go 并发安全的map sync.Map适用的适用场景 阅读详情

syncMap内部设计了read,dirty和mu三个字段,如下

type Map struct {
	mu Mutex
	dirty map[interface{}]*entry
	misses int
}

重点关注其中的read
read保存只读数据, 其中的amended=true表示read中的数据和dirty中不同,默认false

type readOnly struct {
	m       map[interface{}]*entry
	amended bool // true if the dirty map contains some key not in m.
}

dirty字段也是一个map,同read中的m字段,不同的是写入操作第一时间都会写入到dirty中,而读取操作每一次会先读read

那么为什么syncMap的写入性能会差呢?, 因为一下两点的共同作用

  • 当读取的miss超过dirty中元素的数量时, dirty的内容会指向read,原来的dirty置为nil, read的amended置为false
  • 第一次有read和dirty中都不存在的数据写入时, 会遍历read并依次赋值为dirty

第一个过程很快,是指针的指向改变,而第二个过程很慢因为要遍历

所以当miss率很高且qps也且map中的数据量也很大时很高很大三个条件都满足时,syncMap的写入操作正好能频繁遇到遍历read写入dirty的操作,从外部看就是syncmap的写入操作每个一段时间就会有明显的耗时增加

Golang map range遍历结果不稳定问题 闲言少叙,本文主要是想介绍一个Golang开发常见的一个问题。然而,此问题对于初学者来说却经常容易陷入坑中。 问题 我在写一段代码时,使用了Golang的map数据结构,目的是想用map缓存计数结果。简单来说map的键也是整型的,且以递增顺序存储。我的最初想法是,在统计结束后,按照map中存储的键有序输出值。可是,当我运行程序时,结果并不是我想要的,而且有一定概率运行结果不同。 问题代码 func sortByBits(arr []int) []int { var bitmap = mak 阅读详情

相关推荐

SyncMap:源码解读

线程安全的Map Go内建的Map Go内建的Map类型:Map[K]V K必须是可比较类型,V可以是任意类型也可以是nil 在Go中整数、浮点数、复数、string、chan、指针、接口、包含可比较元素的struct和数组都是可比较类型,slice、map、func不是可比较类型 注意:使用包含可比较元素的struct当做key时,如果struct的可比较元素值改变了那么无法根据这个struct获取到对应的value import "fmt" type structKey struct { a int

qq_36059306的博客 373

go 分段锁ConcurrentMap,map+读写锁,sync.map的效率测试

分段锁ConcurrentMap的实现请参考笔者的另外一篇博客: go 分段锁ConcurrentMap的实现源码 效率测试结论: 1. go自带的map不是多协程安全的 2. 分段锁ConcurrentMap是多协程安全的,且效率最高;sync.map效率次之,传统的map+读写锁效率最低 3.ConcurrentMap中锁的个数越多,效率越高,因为争夺同一把锁的概率降低了 测试流...

papaya的博客 5077

golang sync.Map之如何设计一个并发安全的读写分离结构?

首先是一个初始的sync.Map 结构,我们往其中写入数据,数据会写到dirty中,同时,由于sync.Map 刚刚创建,所以read map还不存在,所以这里会先初始化一个read map。在 golang中,想要并发安全的操作map,可以使用sync.Map结构,sync.Map 是一个适合读多写少的数据结构,今天我们来看看它的设计思想,来看看为什么说它适合读多写少的场景。如下,是golang 中sync.Map的数据结构,其中 属性read 是 只读的 map,dirty 是负责写入的map,

我活在当下,我巨他妈勇敢。 936

golang map的遍历

遍历keypackage main import ( "fmt" ) func main() { var mymap map[string]string mymap = map[string]string{"1a": "Very", "2b": "good", "3c": "day"} for one := range mymap {

翔云 4万+

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9228

SAP采购申请详述;以及采购计划协议/交货计划行

SAP采购申请详述;以及采购计划协议/交货计划行

saplakes的博客 4338

golang中map并发读写问题及解决方法

一、map并发读写问题 如果map由多协程同时读和写就会出现fatalerror:concurrentmapreadandmapwrite的错误 如下代码很容易就出现map并发读写问题 funcmain(){ c:=make(map[string]int)gofunc(){//开一个协程写mapforj:=0;...

weixin_30598225的博客 614

WSL2 + Open3D点云可视化踩坑全记录:从GLFW报错到VcXsrv配置,一篇讲清所有‘坑’

本文详细解析了在WSL2环境中使用Open3D进行点云可视化时遇到的常见问题,特别是GLFW报错和VcXsrv配置问题。通过系统性的解决方案和高级配置技巧,帮助开发者彻底解决图形显示、驱动加载和库版本冲突等难题,实现高效的点云可视化。

weixin_30627341的博客 101

golang的加锁map与syncmap性能分析

syncmap是golang1.5引入的线程安全的map,以下是测试程序,结论: 不建议使用sync.map, 原因: 1. 性能不及加锁的map, 2. 对json不友好 测试程序: package main_test import ( "math/rand" "sync" "testing" ) type WrapedMap struct { lck sync.Mutex m ...

如切如磋,如琢如磨 2843

目标检测: yolo26在RK3588上部署

YOLO26发布:端到端目标检测新突破 摘要:Ultralytics最新发布的YOLO26算法采用原生端到端设计,无需NMS后处理,显著提升推理效率。该模型基于三大核心原则: 简洁性:消除NMS步骤,实现直接预测 部署效率:简化集成流程,降低延迟 训练创新:引入MuSGD混合优化器,加速收敛 部署教程显示,YOLO26可适配RK3588等边缘设备,通过ONNX转换和RKNN工具链实现高效部署。其创新架构特别优化了分割、姿态估计等专业任务,标志着目标检测技术的重要革新。 (字数:149)

qianxun 1442

8-阿里云服务器 ECS配置R及Studio Server

步骤概览:(首先要明确自己的系统然后进行安装)

hx2024的博客 1570

syncmap golang_[入门] golang下Map的使用和性能分析(勿滥用锁)

golang 中 map 性能优化[低阶]简单介绍golang 中的 build-in 的 map 这个 map 是非线程安全的,但是也是最常用的一个家伙。 为了测试多个 map 的性能我写了个接口 Maptype 然后这是封装的普通的 maptype 别看一堆代码,其实就是 get 和 set 操作。在这里我们要使用 golang 自带的 test 工具func 这其中有个变量 Writer 就...

weixin_39834084的博客 385

增益调度控制 —— 理论、案例与交互式 GUI 实现

本文详细介绍了增益调度控制的基本原理、数学模型及公式推导,探讨了该方法在适应非线性系统和大范围工作条件下的优势与局限。通过航空飞行控制、发动机推力控制以及化工过程控制三个典型案例,我们展示了如何利用调度变量动态调整控制增益,从而使得控制系统在各个工作点均能达到优良性能。为帮助工程师和研究者更直观地理解并验证增益调度控制的实际效果,本文提供了一套基于 Python 与 PyQt6 的交互式 GUI 控制系统代码。用户不仅可以实时查看仿真数据,还能通过在线调节参数直观体验调度控制的优势。

闲人编程的博客 1480

Golang从入门到放弃200712--SyncMap

SyncMap

WhV5的博客 174

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 415

QT+Opencv实现视频流播放

1.流程 首先通过opencv打开视频流,获取到数据帧,然后将数据帧转换为QT可识别的图像,显示到QT界面上。 2.opencv解码线程源码 //DecodeOpencv.h #pragma once #include <QThread> #include <QObject> #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/img..

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 6459

Go-知识sync map

sync map 将互斥锁内置实现并发读写,将互斥锁的范围仅仅限定在dirty表,减少锁等待和锁调用,提升性能。因为dirty表和read表总是在争取保持一致,所以大部分读场景下,read表就能查询到数据,适合读多写少。sync map 中read表和dirty表都会持有key,所以内存占用上会比较大,而且在写多读少的场景下,因为既要遍历read表,又要遍历dirty表,性能上会比较慢。

a18792721831的博客 2273

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

go syncmap使用案例&&并发优势

前言 平时我们使用map是非线程安全的,这时候我们会想到go官方的sync.map ,今天介绍一下sync.map优势以及通过一个案例来快速入门sync.map 先通过一个案例来入门 代码: package main import ( "fmt" "sync" ) // 原子操作map func main() { var a sync.Map a.Store("key1",1111) fmt.Println(a.Load("key1")) a.Delete("key1") } 优势 1.传

Venvis的博客 227

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Golang sync.Map原理

原生map的“先天不足” 对于已经初始化了的原生map,我们可以尽情地对其进行并发读: package main import ( "fmt" "math/rand" "sync" ) func main() { var wg sync.WaitGroup var m = make(map[int]int, 100) for i := 0; i < 100; i++ { m[i] = i } wg.Add(10)

bob的博客 1371

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Golang 基础之并发基本同步原语(三)

本文主要介绍 sync 标准库中的 sync.Map 介绍及使用。

changhao 720

go sync.Map 设计与实现

一顿源码看下来,我们不难发现,sync.Map的大部分方法整体处理流程上是非常相似的,都是先从read map中读取,如果没有找到,那么就需要加锁,然后做。如果还是没找到,那么就从dirty map中查找,如果还是没找到,那么就返回false。这样做的目的都是在尽量地减少锁的占用,从而获得更好的性能。同时,如果在dirty map中查找的次数多了,会触发dirty map转换为read map的操作流程,这样一来,下一次搜索同样的key就不再需要加锁了。最后一个关键的点是,在sync.Map。

rubys007的博客 1905

一口气搞懂 Go sync.map 所有知识点

大家好,我是煎鱼。在之前的 《为什么 Go map 和 slice 是非线程安全的?》文章中,我们讨论了 Go 语言的 map 和 slice 非线程安全的问题,基于此引申出了 map ...

EDDYCJY的博客 4534

Golang原理剖析(Sync.Map)

Go语言原生的map不支持并发读写,为此官方提供了并发安全的sync.Map。sync.Map采用空间换时间策略,通过read map(无锁访问)和dirty map(加锁访问)的双层结构实现并发安全。read map作为缓存层处理大部分读请求,dirty map作为底层存储处理写请求和read map未命中的请求。两个map共享entry指针,确保数据更新可见性。sync.Map支持Store(写/更新)、Load(读)、Delete(删除)和Range(遍历)操作,测试表明这些操作都是并发安全的。其核心

Atticus的博客 977

Golang:sync.Map

由于map在gorountine 上不是安全的,所以在大量并发读写的时候,会出现错误。 在1.9版的时候golang推出了sync.Map. sync.Map 通过阅读源码我们发现sync.Map是通过冗余的两个数据结构(read、dirty),实现性能的提升。 为了提升性能,load、delete、store等操作尽量使用只读的read; 为了提高read的key命中概率,只...

baihe9649的博客 240

一周 Go World 新鲜事-2018W45

01并发map --- sync map分析本文基于1.10源码分析,如之前的文章可以看到,golang中的map是不支持并发操作的,golang推荐用户直接用读写锁对m...

Go中国 277

深入理解 go sync.Map - 基本原理

普通的map不支持并发读写。有以下两种方式可以实现map的并发读写:使用sync.Mutex互斥锁。读和写的时候都使用互斥锁,性能相比会差一些。使用读写锁。读的锁是可以共享的,但是写锁是独占的。性能相比sync.Mutex会好一些。sync.Map里面会先进行原子操作来读取key,如果读取不到的时候,才会需要加锁。所以性能相比sync.Mutex和会好一些。sync.Map里面几个常用的方法有(CRUD):Store:我们新增或者修改数据的时候,都可以使用Store方法。Load。

rubys007的博客 2298
上一篇: LeetCode50. 动态规划方法求阶乘
下一篇: promise,async,await的区别
河流儿
博客等级 码龄11年 45粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值