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

这篇具有很好参考价值的文章主要介绍了【介绍一个组件】go: Copy-On-Write map,对读极多和写极少的场景做优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

  • cnblogs博客
  • zhihu
  • Github
  • 公众号:一本正经的瞎扯
    【介绍一个组件】go: Copy-On-Write map,对读极多和写极少的场景做优化

代码请看: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. 😃文章来源地址https://www.toymoban.com/news/detail-856734.html

到了这里,关于【介绍一个组件】go: Copy-On-Write map,对读极多和写极少的场景做优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTB ACADEMY-Stack-Based Buffer Overflows on Linux x86 WRITE UP

    We were able to gain SSH access to a Linux machine whose password was reused by another machine during our penetration test. On this machine, we have a standard user \\\"htb-student\\\" who can leave a message to the administrator using a self-written program called \\\"leave_msg.\\\" Since the target company pays a lot of attention to defense from outside their network

    2024年02月05日
    浏览(41)
  • 介绍一个.Net远程日志组件

    对于软件开发的阶段和正式运行阶段,我们都需要查看日志来诊断出现的问题。不过,在查看日志时需要登录服务器,找到特定的日志文件,再查看其中的内容,这显然不是很方便。 为了解决这个问题,我们可以使用远程日志,让所有的程序产生的日志都可以通过一个 web 页

    2023年04月17日
    浏览(34)
  • 从零实现一个数据库(DataBase) Go语言实现版 0.介绍

    英文源地址 我们为什么需要数据库?为什么不是直接把数据dump进文件中. 第一个话题就是持久化. 我们将讨论如果写入文件的过程中程序崩溃了, 或者电源断电了, 文件的状态会是什么样的呢? 文件是否只是丢失了最后一次写操作? 或者以写了一半的文件结束 或者是以更差的状态

    2024年02月06日
    浏览(40)
  • PiflowX组件 - Elasticsearch7Write

    组件说明 将数据写入到Elasticsearch-7引擎的索引中。 计算引擎 flink 组件分组 ElasticSearch 端口 Inport:默认端口 outport:默认端口 组件属性 名称 展示名称 默认值 允许值 是否必填 描述 例子 hosts hosts “” 无 是 要连接到的一台或多台Elasticsearch主机。 http://host_name:9092;http://host_

    2024年01月18日
    浏览(27)
  • A value is trying to be set on a copy of a slice from a DataFrame解决方案

    在使用pandas的时候,出现如下的警告。虽然不会影响程序的正常运行,但是看着就很烦。 原理:当前操作的dataframe是从其他dataframe得到的,不是最初始的dataframe。因此,最好是 在原始的dataframe上进行操作 ,这样就不报警告了。 解决方案: 新建一个dataframe,在新的上面进行

    2024年02月16日
    浏览(56)
  • read/write和fread/fwrite介绍

    UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write 这里简单的介绍一下他们的区别。 1. fopen 系列是标准的C库函数;open系列是 POSIX 定义的,是UNIX系统里的system call。 也就是说,fopen系列更具有可移植性;而open系列只能用在 POSIX 的操作系

    2024年02月09日
    浏览(41)
  • 【Go】Go 语言教程--Go 语言Map(集合)(十六)

    往期回顾: Go 语言教程–介绍(一) Go 语言教程–语言结构(二) Go 语言教程–语言结构(三) Go 语言教程–数据类型(四) Go 语言教程–语言变量(五) Go 语言教程–GO语言常量(六) Go 语言教程–GO语言运算符(七) Go 语言教程–GO条件和循环语句(八) Go 语言教程

    2024年02月16日
    浏览(46)
  • go数据类型-map

    go的map在面试时候经常会被问到。 最近看到群里有个被问到为什么map的每个桶中只装8个元素? 注:解决hash冲突还有一些别的方案:开放地址法 (往目标地址后面放)、再哈希法(再次hash) 跟进看 buckets的结构: 每个桶 定义了 有8个哈希值的容量。 这里就解释了为什么一个

    2024年02月05日
    浏览(36)
  • Go Map

    学习了GO语言中数组,切片类型,但是我们发现使用数组或者是切片存储的数据量如果比较大,那么通过下标来取出某个具体的数据的时候相对来说,比较麻烦。例如: 现在要取出切片中存储的“王五”,那么需要数一下对应的下标值是多少,这样相对来说就比较麻烦。有没

    2024年02月11日
    浏览(6)
  • 【Go】 map 精髓理解

    map go map 的底层结构 hmap,的四个元素 然后再讲一下 buckets 的元素,讲一下 hash 冲突,和解决方法 再讲一下,增量扩容和等量扩容 再讲一下增删改查的过程,就查询过程 map 基础 向值为 nil 的 map 添加元素会发生 panic,说白了就是给声明但是没初始化的map添加元素 查询时候,

    2024年02月16日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包