【VictoriaMetrics源码阅读】: vm中对map的优化
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
在并发环境下的map,第一想到的就是sync.Map,但是在读多写少的情况下,sync.Map的查询性能不如map;且,sync.Map的内存结构更加复杂,不便于准确的控制总内存量。
于是VM中应用了这样一些技巧来避免使用synv.Map:
- 对象中使用了两个map,分为mutable可变和immutale不可变;
- 查询的时候,先不加锁查询immutable,如果查询不到,再加锁查询mutable;
- 写入数据的时候,加锁写入mutable;
- 查询的时候触发mutable到immutable的迁移:
- 内部记录一个下次迁移时间,默认是10秒;也就是最短10秒才会触发mutable到immutable的搬迁;(业务场景允许)
- 搬迁的时候,把immutable写入到mutable,然后把当前的mutable作为immutable
- 为什么不是把mutable的数据写入immutable呢?因为immutable是读不加锁的,为了实现这部分查询的无锁,只能搬迁到新对象上去。
- 有时候,某个KEY的查询会非常频繁。因此会把最后一次命中的value写到额外的成员变量。查询的时候优先判断key是否是上次查询的key,如果是就直接返回缓存的value。这是某种意义的分支预测技术!
【VictoriaMetrics源码阅读】: vm中对map的优化的更多相关文章
- JDK源码阅读-DirectByteBuffer
本文转载自JDK源码阅读-DirectByteBuffer 导语 在文章JDK源码阅读-ByteBuffer中,我们学习了ByteBuffer的设计.但是他是一个抽象类,真正的实现分为两类:HeapB ...
- boost.asio源码阅读(2) - task_io_service
1.0 task_io_service 在boost.asio源码阅读(1)中,代码已经查看到task_io_service中. 具体的操作调用void task_io_service::init_t ...
- SpringMVC源码阅读:Controller中参数解析
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- 源码阅读笔记 - 1 MSVC2015中的std::sort
大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
- caffe-windows中classification.cpp的源码阅读
caffe-windows中classification.cpp的源码阅读 命令格式: usage: classification string(模型描述文件net.prototxt) string( ...
- caffe中batch norm源码阅读
1. batch norm 输入batch norm层的数据为[N, C, H, W], 该层计算得到均值为C个,方差为C个,输出数据为[N, C, H, W]. <1> 形象点说,均值的 ...
- go 中 select 源码阅读
深入了解下 go 中的 select 前言 1.栗子一 2.栗子二 3.栗子三 看下源码实现 1.不存在 case 2.select 中仅存在一个 case 3.select 中存在两个 case,其 ...
- 源码阅读系列:EventBus
title: 源码阅读系列:EventBus date: 2016-12-22 16:16:47 tags: 源码阅读 --- EventBus 是人们在日常开发中经常会用到的开源库,即使是不直接用的 ...
- EventBus源码解析 源码阅读记录
EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...
- SparkConf加载与SparkContext创建(源码阅读一)
即日起开始spark源码阅读之旅,这个过程是相当痛苦的,也许有大量的看不懂,但是每天一个方法,一点点看,相信总归会有极大地提高的.那么下面开始: 创建sparkConf对象,那么究竟它干了什么了类,从 ...
随机推荐
- C# 跳过值班时间代码逻辑
/// <summary> /// 当前时间是否是值班时间 /// </summary> private bool IsDutyTime { get { var dutyTim ...
- PPT 流星动画
https://www.bilibili.com/video/BV1w54y1Q7cZ?p=6 星空背景绘制 绘制矩形框 背景不再被拖动 处理前先复制一份,用于后面做激光效果 星星效果 再次组合 按S ...
- Linux 检查应用不在现就重启
每5分钟检查一次,如果不在线就重启 #!/bin/bash count=`ps axu | grep kafka_2.11-1.0.0|grep -v grep|wc -l` echo "p ...
- GO语言之环境搭建和基本命令
目录 go语言基础 下载go编译器 go目录简介 gopath简介 环境变量配置 GOPATH PATH go语言项目结构 IDE下载与配置 安装goland goland里添加goroot和gopa ...
- 网传的Spring大漏洞
昨天凌晨发了篇关于Spring大漏洞的推文,白天就有不少小伙伴问文章怎么删了. 主要是因为收到朋友提醒说可能发这个会违规(原因可参考:阿里云因发现Log4j2核弹级漏洞但未及时上报,被工信部处罚),所 ...
- XShell、XFtp免费许可证增强:删除标签限制!
大家好,我是DD! XShell相信大家都不陌生了,作为Windows平台下最强大的SSH工具,是大部分开发者的必备工具.但由于免费许可证的标签限制,有不少开发者会去找破解版使用.虽然功能是可以使用了 ...
- 【QT 学习之路】事件
事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等:另一些事 ...
- vue3引入使用svg图标
vue3使用svg图标 安装 // 通过命令安装2个插件 npm i vite-plugin-svg-icons -D npm i fast-glob -D 在vue.config.js中配置 //v ...
- ASP.Net Core 5.0 MVC Session的添加,及它与Cookie的关系
1.在控制器上新增一个方法 public IActionResult SessionAndCookie() { string result = HttpContext.Session.GetStrin ...
- 简化 libevent 编译
在 CMakePresets.json 的 cacheVariables 字段加入 { "EVENT__DISABLE_OPENSSL": "ON", &quo ...
