首页 > 其他分享 >【介绍一个组件】go: Copy-On-Write map,对读极多和写极少的场景做优化

【介绍一个组件】go: Copy-On-Write map,对读极多和写极少的场景做优化

时间:2024-04-24 10:44:33浏览次数:19  
标签:map CowMap RWMutex Map sync Write 对读 99.99%

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


代码请看:https://github.com/ahfuzhang/cowmap

有这样一种场景:数据量不多的map,在使用中读极多写极少。为了在这种场景下做极致的优化,我实现了 copy-on-write 的map:
其实现原理为:所有的读都可以不加锁的并发读取,一旦需要写,则 copy 一份原来的map,在备份上修改,然后通过原子操作把指针切换到新的对象上。

我对比了CowMap(Copy-On-Write Map) 和 sync.Map , 以及普通map + 读写锁三种方式的性能:

Read-write rate Type ns/op
99.99% : 0.01% CowMap 4.649
99.99% : 0.01% map + sync.RWMutex 187.5
99.99% : 0.01% sync.Map 15.06
99.90% : 0.10% CowMap 32.70
99.90% : 0.10% map + sync.RWMutex 159.9
99.90% : 0.10% sync.Map 14.08
99.00% : 1.00% CowMap 303.6
99.00% : 1.00% map + sync.RWMutex 105.7
99.00% : 1.00% sync.Map 14.08

因此,当读的比例超过 99.99%时,CowMapsync.Map 的 3.24 倍。是 map+sync.RWMutex 的 40.33 倍。

不过我认为更好的视线方法,还是应该参考 rust hashbrown 的实现(see: 《Swisstable:C++中比std::unordered_map更快的hash表》),这样有可能实现这样一些优化:

  • 因为hash的结构是平坦的数组,理论上在不扩容和缩容的前提下,读写都能做到无锁
  • 使用simd指令集来搜索位置,能够提供更好的查找速度。

Have Fun.

标签:map,CowMap,RWMutex,Map,sync,Write,对读,99.99%
From: https://www.cnblogs.com/ahfuzhang/p/18154554

相关文章

  • Flink状态编程:为什么不建议在ValueState里面存Map?
    Flink状态编程:为什么不建议在ValueState里面存Map?文章目录先说结论性能:TTL:State需要存什么数据Heap模式ValueState和MapState如何存储StateBackend模式如何存储和读写State数据1.RocksDB模式ValueState和MapState如何存储1.1ValueState如何映射为RocksDB......
  • 并发编程(ReentrantReadWriteLock)
    ReentrantReadWriteLock是一个可重入读写锁,内部提供了读锁和写锁的单独实现。其中读锁用于只读操作,可被多个线程共享;写锁用于写操作,只能互斥访问ReentrantReadWriteLock尤其适合读多写少的应用场景读多写少:在一些业务场景中,大部分只是读数据,写数据很少,如果这种场景下依然使用......
  • DataX二次开发详解-Kingbasees86Reader、Kingbasees86Writer插件
     一、前提国产数据库的崛起元年,不得不提人大金仓(Kingbase)、南大通用数据库(Gbase)、达梦数据库(DM)、华为数据库(GaussDB)、阿里数据库(Oceanbase)等,此文章介绍采用datax作为同步人大金仓Kingbase86数据库的工具。目前github上的datax版本功能仅支持Kingbase82系列产品。而项目上如果要......
  • 搭建SSM框架mapper.xml映射开发方式
    搭建SSM框架mapper.xml映射开发方式学习目标本节我们将学习如何搭建SSM框架映射文件开发方式,也就是将sql语句放在mapper.xml文件中进行开发,适用于频繁更新需求的项目。搭建方法pom.xml引入依赖以下依赖项为最低需求,可根据功能需要增加相关依赖。<?xmlversion="1.0"encodin......
  • 为什么Mybatis Mapper不需要实现类?
    在学习Java动态代理之前,我想让大家先思考这样几个问题。JDK动态代理为什么不能对类进行代理?MybatisMapper接口为什么不需要实现类?目录代理模式说到Java动态代理,就不得不提代理模式。为什么要使用代理模式呢?生活中对代理模式的使用无处不在,例如明星经纪人对明星业务的代理;......
  • map容器
    作为关联式容器的一种,map容器存储的都是pair对象,也就是用pair类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括C++基本数据类型(int、double等)、使用结构体或类自定义的类型。与此同时,在使用map容器存储多个键值对时,该容器会自动根据各键值对的键的大小......
  • Map使用对象作key
    Map介绍:Map是一个集合,一种依照键(key)存储元素的容器,键(key)很像下标,在List中下标是整数。在Map中键(key)可以是任意类型的对象。Map中不能有重复的键(Key),每个键(key)都有一个对应的值(value);Map的key和value都是泛型的,所以Map的key和value可以任意类型的使用对象做Map的key......
  • MIT6824 MapReduce总结
    MapReduce是一个分布式大任务计算框架,旨在可以方便Google内部的将大型任务拆分到集群环境下,以得到并行化的处理速度。在分布式情况下,多台机器协作完成一个大型任务需要考虑很多问题:整个分布式系统中都有哪些角色?可以预见的就是肯定有任务的拆分者负责拆分调度任务,有任务的实际......
  • sqlmap简单使用方法
    基本格式sqlmap-u"http://www.vuln.cn/post.php?id=1"默认使用level1检测全部数据库类型sqlmap-u"http://www.vuln.cn/post.php?id=1" --dbmsmysql--level3指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)cookie注入当程序有防get注入的时候,可以使用cookie注......
  • 基于python语言命令行模式的nmap扫描- python-nmap
    使用python命令行模式进行nmap扫描,简化流程首先安装python环境https://www.python.org/downloads/安装nmap,python-nmap需要借助nmap运行https://nmap.org/download写python-nmap脚本https://github.com/home-assistant-libs/python-nmap代码:点击查看代码......