当前位置: 首页 > news >正文

【优秀三方库研读】【性能优化点滴】odygrd/quill 解决伪共享

一、伪共享(False Sharing)问题本质

当不同CPU核心频繁修改**同一缓存行(Cache Line)**中的不同变量时,会导致严重的性能下降。现代CPU的缓存系统以缓存行(通常64字节)为单位操作内存,即使两个线程修改的是同一缓存行中的不同变量,也会引发:

  1. 缓存一致性协议(如MESI)强制使其他核心的缓存行失效
  2. 导致不必要的内存总线流量缓存同步延迟
  3. 可能造成数百个时钟周期的性能损失

二、Quill中的具体场景分析

alignas(QUILL_CACHE_LINE_ALIGNED) std::atomic<integer_type> _atomic_writer_pos{0};
alignas(QUILL_CACHE_LINE_ALIGNED) integer_type _writer_pos{0};

这两个变量分别表示:

  • _atomic_writer_pos:原子写位置(被生产者线程频繁修改)
  • _writer_pos:普通写位置(可能被消费者线程读取)

无对齐时的风险

  • 如果这两个变量位于同一缓存行
  • 生产者修改_atomic_writer_pos会导致消费者持有的_writer_pos缓存失效
  • 即使消费者只是读取_writer_pos,也会被迫从内存重新加载

三、alignas 的技术实现

QUILL_CACHE_LINE_ALIGNED 通常定义为:

#define QUILL_CACHE_LINE_SIZE 64
#define QUILL_CACHE_LINE_ALIGNED alignas(QUILL_CACHE_LINE_SIZE)

内存布局效果

[ Cache Line 0 (64B) ]
_atomic_writer_pos (独占整个缓存行)
padding (剩余空间)[ Cache Line 1 (64B) ]
_writer_pos (独占整个缓存行)
padding (剩余空间)

四、性能优化对比

场景性能影响解决方案
伪共享存在吞吐量下降5-10倍无处理
手动填充字节代码冗余,维护困难传统方案
alignas对齐完全消除伪共享Quill采用的方法

实测数据示例(x86架构):

  • 有伪共享:约120ns/操作
  • 缓存行对齐后:约15ns/操作

五、与其他技术的协同

  1. 原子操作优化

    _atomic_writer_pos.store(..., std::memory_order_release);
    

    结合缓存对齐,使原子操作只需处理单个缓存行

  2. 内存访问模式

    • 生产者只访问_atomic_writer_pos的缓存行
    • 消费者只访问_writer_pos的缓存行
    • 完全避免跨核心缓存同步

六、不同硬件架构的考量

  1. x86架构

    • 缓存行64字节
    • 较强的内存模型,对齐收益显著
  2. ARM架构

    • 缓存行可能32或64字节
    • 弱内存模型下更依赖明确的内存屏障
  3. 跨平台兼容

    #if defined(__aarch64__)
    #define QUILL_CACHE_LINE_SIZE 64
    #else
    #define QUILL_CACHE_LINE_SIZE 64 // 大多数情况
    #endif
    

七、设计哲学体现

  1. 机械同情(Mechanical Sympathy)

    • 尊重CPU缓存工作机制
    • 最小化硬件层面的竞争
  2. 零成本抽象

    • 编译期完成对齐
    • 无运行时开销
  3. 防御性编程

    • 即使当前硬件容忍伪共享,也为未来预留优化空间

八、验证方法

开发者可以通过以下方式验证对齐效果:

  1. 性能分析工具

    • Linux perf c2c 检测缓存行竞争
    • Intel VTune 分析伪共享事件
  2. 内存地址检查

    static_assert(reinterpret_cast<uintptr_t>(&_atomic_writer_pos) % 64 == 0);
    
  3. 基准测试对比

    • 有/无对齐情况下的吞吐量对比

这种精细的缓存优化是Quill能达到纳秒级延迟的关键设计之一,特别适合高频日志场景下保持稳定的高性能表现。

相关文章:

【优秀三方库研读】【性能优化点滴】odygrd/quill 解决伪共享

一、伪共享&#xff08;False Sharing&#xff09;问题本质 当不同CPU核心频繁修改**同一缓存行&#xff08;Cache Line&#xff09;**中的不同变量时&#xff0c;会导致严重的性能下降。现代CPU的缓存系统以缓存行&#xff08;通常64字节&#xff09;为单位操作内存&#xff…...

JavaScript性能优化实战(6):网络请求与资源加载优化

引言 在现代Web应用开发中,网络性能已成为影响用户体验的关键因素。据统计,用户等待页面加载的耐心通常不超过3秒,超过这个时间,约40%的用户会选择离开。此外,Google的研究表明,页面加载时间每增加0.5秒,流量就会下降约20%。因此,优化网络请求和资源加载不仅关乎用户体…...

re题(49)BUUCTF-crackMe

BUUCTF在线评测 int wmain() {FILE *v0; // eaxFILE *v1; // eaxchar v3; // [esp3h] [ebp-405h]char v4[256]; // [esp4h] [ebp-404h] BYREFchar Format[256]; // [esp104h] [ebp-304h] BYREFchar v6[256]; // [esp204h] [ebp-204h] BYREFchar v7[256]; // [esp304h] [ebp-10…...

Python中的单例模式:深入探索元类与装饰器实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 单例模式(Singleton Pattern)是设计模式中的一种重要模式,确保一个类在整个应用中只有一个实例,并且提供全局访问点。Python语言作为一…...

深入解析 Babylon.js 中的 TransformNode.lookAt 方法

在 3D 开发中&#xff0c;控制对象朝向是一个基础但关键的需求。Babylon.js 作为一款强大的 Web3D 引擎&#xff0c;提供了 TransformNode.lookAt 方法来实现这一功能。本文将全面解析这个方法的使用技巧、参数含义以及常见应用场景。 方法基础 TransformNode.lookAt 的基本签…...

SpringCloud组件——Gateway

一.网关 1.问题提出 我们通过Eureka&#xff0c;Nacos解决了服务注册&#xff0c;服务发现的问题&#xff0c;使用SpringCloud LoadBalance解决了负载均衡的问题&#xff0c;使用OpenFeign解决了远程调用的问题。 但是当前所有微服务的接口都是直接对外暴露的&#xff0c;可…...

Boost 库安装 (windows 11)

Boost 库安装 (windows 11 1 下载2 生成3 使用 1 下载 下载地址&#xff1a;https://www.boost.org/ 有的时候会需要历史版本下载&#xff1a; https://www.boost.org/users/history/ 2 生成 1、解压后点击 bootstrap.bat&#xff0c;会生成可执行程序b2.exe 2、双击运行b2.…...

lmms-eval--微调实战笔记

lmms-eval--大模型调用平台&#xff0c;方便新手上手大模型微调 lmms-eval的更多用法,没有mathversehttps://github.com/EleutherAI/lm-evaluation-harness.git 单卡运行&#xff0c;模型gpt-j-6B&#xff0c;数据集hellaswag git clone --depth 1 https://github.com/Eleuthe…...

序列密码算法ShanLooog512设计原理详解

序列密码算法ShanLooog512设计原理详解 ShanLooog512(闪龙512)为序列密码算法&#xff0c;内部状态为512比特&#xff0c;密钥长度为128或256比特&#xff0c;轮函数为FFFFFFFF&#xff0c;循环轮数为24轮&#xff0c;输出密钥流为512比特的状态。与Salsa20类似&#xff0c;内…...

Matplotlib可视化基础

1. 折线图 matplotlib.pyplot.plot() # 主要参数&#xff1a; x,y -- 接收array&#xff0c;表示X轴和Y轴对应的数据&#xff0c;无默认 color -- 接收特定string&#xff0c;指定线条的颜色&#xff0c;默认为None linestyle -- 接收特定string&#xff0c;指定线条的类型…...

Linux 内核网络协议栈中的关键数据结构:inet_skb_parm 与 ip_options

在 Linux 内核的网络协议栈中,数据包的高效处理依赖于一系列精心设计的数据结构。这些结构体不仅需要存储网络数据的元信息,还需支持复杂的协议逻辑(如路由、分片、安全策略等)。本文聚焦两个核心结构体 struct inet_skb_parm 和 struct ip_options,解析它们的设计原理、功…...

oracle 数据库查询指定用户下每个表占用空间的大小,倒序显示

oracle 查询指定用户下每个表占用空间的大小&#xff0c;倒序显示 使用场景&#xff1a;数据分析&#xff1b;导出医院正式库到开发环境时&#xff0c;查询出占用表空间高的业务表、导出时排除该表 在Oracle数据库中&#xff0c;要查询指定用户下每个表占用空间的大小并以倒序…...

Missashe考研日记-day29

Missashe考研日记-day29 1 专业课408 学习时间&#xff1a;3h学习内容&#xff1a; 今天先是把虚拟存储剩余的课听完了&#xff0c;然后就是做课后选择题&#xff0c;57道&#xff0c;已经接受了OS课后题尤其多的事实了。解决并且理解完习题之后就开始预习文件管理的内容&…...

【AI】【MCP】搭建私人王炸MCP自动化工作流

目录 一、什么是MCP 二、MCP大集合 三、准备工作 3.1 安装node.js 3.2 安装vscode 3.3 安装cline插件 3.3.1 安装 3.3.2 配置Cline 四、配置MCP服务 4.1 Search-mcp服务 4.2 playwright-mcp 服务 前言&#xff1a;梦想组合&#xff0c;轻松办公&#xff0c;告别手动&a…...

多元函数微分之传统方法和全微分法

一、传统方法 使用链式法则&#xff0c;先对中间变量&#xff08;如 u,v&#xff09;求偏导&#xff0c;再乘以中间变量对最终变量&#xff08;如 x,y&#xff09;的偏导。 二、全微分法 基于全微分形式不变性&#xff0c;直接对 zf(u,v) 求全微分 dz&#xff0c;再代入 du 和…...

新手SEO基础优化全解析

内容概要 对于刚接触SEO的新手而言&#xff0c;系统化理解优化逻辑是避免无效操作的关键。本文将从基础概念入手&#xff0c;逐步拆解搜索引擎排名的影响要素&#xff0c;围绕关键词分析、技术优化、内容策略三大核心模块&#xff0c;提供可落地的操作框架。通过结合工具使用说…...

MATLAB退火算法和遗传算法解决旅行商问题

模拟退火算法和遗传算法都是常用于解决旅行商问题&#xff08;TSP&#xff09;的优化算法&#xff0c;它们在原理、搜索方式、收敛速度和适用场景等方面存在一些区别&#xff1a; 原理 模拟退火算法&#xff1a;模拟退火算法的灵感来源于固体退火原理。固体在加热后缓慢冷却时…...

喜马拉雅卖身腾讯音乐:在线音频独立时代的终结

坦白说,这条消息一出来,喜马拉雅被卖掉不太奇怪,但是腾讯音乐会收购,还是有点意外。 喜马拉雅之前一度被称为中国版Audible平台,在过去几年里,活生生地把一手好牌打得稀烂。如今走到“卖身”这一步,既是无奈,也是必然。 简单回顾一下背景: 2012年,喜马拉雅成立,一…...

简单理解https与http

都是超文本传输协议&#xff0c;一个安全一个不安全&#xff0c;名字长的安全&#xff0c;名字短的不安全。 安全与不安全是居于什么分别的&#xff1f; 通过加密 http无加密。 httpshttp SSL/TSL&#xff08;加密&#xff09;来保障数据安全。加密传输 身份验证 SSL/TLS…...

打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解

目录 打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解 1. 可观测体系&#xff1a;WhizardTelemetry 全家桶 2. 平台与多集群治理 3. CI/CD 与交付效率 4. 网络与流量入口 5. 安全与合规 6. 存储与数据保护 7. 平台集成优势 结语 打造…...

配置扩展ACL

1.扩展ACL简介&#xff1a; 扩展ACL可以更精确地控制基于源IP地址、目标IP地址、协议类型和端口号的流量。 2.配置背景&#xff1a; 为了实现公司内部只能使用FTP服务器传输文件并关闭其他所有服务和端口的需求&#xff0c;可以通过配置访问控制列表&#xff08;ACL&#xf…...

根据用户出生日期计算年龄

public static int calculateAgeFromDate(Date birthDate) { // 将 Date 转换为 LocalDate&#xff08;默认时区&#xff09; LocalDate birthLocalDate birthDate.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); // 获取当前日期LocalDate currentDate Local…...

测试基础笔记第十五天

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、集合1.集合的定义二、使用集合列表去重 导包二、函数1.函数介绍2.定义函数3.调用函数4.函数实现登录案例5.函数的返回值 三、模块和包1.模块的概念(Module)2.模…...

【专题四】前缀和(3)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…...

STM32 USB配置详解

STM32 USB配置详解 一、USB基础概念 1.1 USB简介 USB (Universal Serial Bus) 是一种用于计算机与外部设备连接的串行总线标准&#xff0c;具有热插拔、即插即用等特点。STM32微控制器内置了多种USB接口&#xff0c;可实现各类USB应用。 1.2 USB速度等级 Low Speed (LS): …...

2025年Mapbox零基础入门教程(1)地图初始化

什么是mapbox&#xff1f; mapbox是一个地图框架&#xff0c;不仅提供前端渲染能力&#xff0c;还具备后端服务接口能力。 相较于openlayers&#xff0c;它可构建二维和三维地图&#xff0c;并支持优化导航路线和位置查询等功能。 开发中使用mapbox需引入库文件并设置token&…...

课外知识:你需要了解的Python类对象里面的__getattr__方法

你需要了解的Python类对象中的__getattr__方法 一、__getattr__基础概念 1. 方法定义 def __getattr__(self, name: str) -> Any:"""当访问不存在的属性时触发"""2. 核心特性 动态属性处理&#xff1a;拦截未定义的属性访问按需触发&…...

openGauss新特性 | DataKit支持PostgreSQL到openGauss的迁移能力

Postgresql-\>openGauss迁移工具debezium-connector-postgres 可获得性 本特性自openGauss 7.0.0-RC1版本开始引入。 特性简介 debezium-connector-postgres工具是一个基于Java语言的Postgresql到openGauss的复制工具。该工具提供了初始全量数据及对象&#xff08;视图、…...

【前端】跟进新趋势- PWA WebAssembly

不定期更新及补充实战。建议关注收藏点赞。 目录 PWA&#xff08;渐进式 Web 应用&#xff0c;Progressive Web App&#xff09;WebAssembly&#xff08;WASM&#xff09; PWA&#xff08;渐进式 Web 应用&#xff0c;Progressive Web App&#xff09; PWA 是一种提升 Web 应用…...

C++学习:六个月从基础到就业——模板编程:SFINAE原则

C学习&#xff1a;六个月从基础到就业——模板编程&#xff1a;SFINAE原则 本文是我C学习之旅系列的第三十六篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第十四篇&#xff0c;主要介绍C模板编程中的SFINAE原则。查看完整系列目录了解更多内容。 目录 C学习之…...

完美解决.NET Framework 4.0 中 System.Drawing 库不支持 WebP 格式的图像处理

如果你想在 .NET Framework 4.0 中使用 ImageMagick 处理图片&#xff0c;可以通过 Magick.NET 库来实现。Magick.NET 是 ImageMagick 的 .NET 封装&#xff0c;可以用来读取、写入、编辑图像。 以下是如何使用 Magick.NET 来处理图像并提取图像的宽度和高度。 步骤&#xff…...

网络基础概念:从菜鸟到入门

前言&#xff1a;快递小哥的故事 想象一下你要给朋友寄个礼物&#xff0c;这个过程其实和网络通信非常相似&#xff1a; 1. 你需要知道朋友的”地址“&#xff08;IP地址&#xff09; 2. 要注明是送到他家大门还是物业代收&#xff08;端口号&#xff09; 3. 要选择快递公司并…...

优先队列和单调队列(双端队列实现的)

这里写自定义目录标题 一、优先队列与单调队列二、优先队列2.1 概念2.2 增删查 判空2.3 示例代码 三、双端队列四、单调队列4.1 单调递增队列4.2 单调递减队列 一、优先队列与单调队列 二、优先队列 2.1 概念 一种特殊的队列&#xff0c;它与普通队列的主要区别在于元素的出…...

设计模式(状态模式)

概述 在实际的软件开发中&#xff0c;状态模式并不是很常用&#xff0c;但是在能够用到的场景里&#xff0c;它可以发挥很大的作用。从这一点上来看&#xff0c;它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工作流引擎等系统…...

安卓基础(get和set)

在 Java 中&#xff0c;​​get 和 set​​ 方法是面向对象编程中 ​​封装&#xff08;Encapsulation&#xff09;​​ 的核心实现&#xff0c;用于安全地访问和修改类的私有字段&#xff08;private 成员变量&#xff09;。它们的核心作用是 ​​控制对数据的访问&#xff0c…...

机器人灵巧操作新突破,力感知技术让机械手更精准

在机器人的发展历程中&#xff0c;让机器人实现灵活操作一直是科研人员努力攻克的难题。 我们这篇文章给大家带来一份新的工作&#xff1a;DexForce 链接&#xff1a;[2501.10356] DexForce: Extracting Force-informed Actions from Kinesthetic Demonstrations for Dextero…...

八大排序——直接插入排序/希尔排序

八大排序——直接插入排序/希尔排序 目录 一、直接插入排序 二、希尔排序 一、直接插入排序 每一趟从待排序序列中取第一个值&#xff0c;将其插入到已排序好的序列中&#xff0c;对已排序好的序列&#xff0c;从右到左依次和待插入值比较&#xff0c;如果大于则向后挪&…...

8、HTTPD服务--ab压力测试

一、ab压力测试 # ab ‐c 100 ‐n 1000 http://vedio.linux.com/index.html 2 This is ApacheBench, Version 2.3 <$Revision: 1430300 $> 3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 4 Licensed to The Apache Software Foundation,…...

node.js 实战——mongoDB

MongoDB MongoDB 简介 MongoDB 是一种基于文档型 (document-oriented) 的 NoSQL 数据库&#xff0c;使用类 JSON 的 BSON 格式存储数据&#xff0c;自然支持复杂数据结构。它特别适合需要快速变化、大量数据处理和高应用扩展性的场景。 MongoDB 特性&#xff1a; 无法表、无…...

C语言学习路线

以下是一份综合多个优质资源的C语言学习路线规划&#xff0c;结合2025年最新技术趋势和工程实践需求&#xff0c;分为三个阶段系统推进&#xff1a; ​一、入门阶段&#xff08;1-2个月&#xff09;​​ ​目标​&#xff1a;掌握基础语法&#xff0c;能编写简单程序&#xff…...

飞凌嵌入式T527核心板获得【OpenHarmony生态产品兼容性证书】

近日&#xff0c;飞凌嵌入式FET527-C核心板通过OpenHarmony 4.1 Release版本兼容测评&#xff0c;获得【OpenHarmony生态产品兼容性证书】。 飞凌嵌入式FET527-C核心板搭载全志T527系列全国产高性能处理器&#xff0c;集成8个ARM Cortex-A55核心&#xff0c;并内置RISC-V核和DS…...

Mioty|采用报文分割(Telegram Splitting)以提高抗干扰能力的无线通信技术

1、什么是Mioty 在物联网&#xff08;IoT&#xff09;快速发展的背景下&#xff0c;低功耗广域网&#xff08;LPWAN&#xff09;技术成为连接海量设备的关键。LPWAN具有低功耗、低成本、广覆盖和强抗干扰能力等特点&#xff0c;使其特别适用于大规模、远距离、低数据速率的IoT…...

WPF 程序监控硬件设备状态变化的实现方案

以下是一个完整的 C# WPF 程序实现方案&#xff0c;用于监控硬件设备状态变化&#xff08;基于设备 SDK API&#xff09;。我们将分步骤实现&#xff0c;包含状态轮询、事件通知、UI 绑定和错误处理。 1. 项目结构设计 HardwareMonitor/ ├── Models/ # 数据模…...

利用Python打印有符号十进制数的二进制原码、反码、补码

有时候手动计算有符号十进制数的二进制原码、反码、补码是一件挺麻烦的事情。 下面是一个段Python 代码&#xff0c;它可以接收一个 16 位有符号十进制数的输入&#xff0c;然后输出其对应的二进制原码、反码和补码&#xff1a; def decimal_to_binary(decimal_num):# 检查输入…...

STM32裸机编程架构与思路

STM32作为广泛应用的微控制器系列&#xff0c;其强大的功能和灵活的编程方式使其成为嵌入式系统开发的优选。裸机编程&#xff08;bare-metal programming&#xff09;指的是在没有操作系统支持的情况下&#xff0c;直接对硬件进行编程。这种方式虽然较为底层&#xff0c;但能够…...

Eureka 深度解析:从原理到部署的全场景实践

一、Eureka 核心原理与架构设计 1. 核心定位与组件模型 Eureka 是 Netflix 开源的服务发现&#xff08;Service Discovery&#xff09;组件&#xff0c;作为 Spring Cloud 微服务体系的核心基础设施&#xff0c;其核心目标是解决分布式系统中服务实例动态管理与跨服务通信解耦…...

有哪些和PPT自动生成有关的MCP项目?

随着AI技术的快速发展, Model Context Protocol(MCP) 作为一种连接大型语言模型(LLMs)与外部工具的开放协议,正在重塑自动化办公领域。在PPT自动生成场景中,MCP通过标准化接口实现了AI模型与设计工具、数据源的无缝整合。以下从技术框架、项目案例、应用场景三个维度展开…...

经典数仓架构深度解析与演进:从离线处理到新型架构对比

经典数仓架构深度解析与演进&#xff1a;从离线处理到新型架构对比 在数据驱动决策的时代&#xff0c;经典数仓作为企业数据管理与分析的核心基础设施&#xff0c;承载着从数据存储到价值挖掘的重要使命。本文将深入剖析经典数仓的架构、数据处理流程、主流架构模式及其对比&a…...

[Python开发] 如何用 VSCode 编写和管理 Python 项目(从 PyCharm 转向)

在 Python 开发领域,PyCharm 一直是广受欢迎的 IDE,但其远程开发功能(如远程 SSH 调试)仅在付费版中提供。为了适应服务器部署需求,很多开发者开始将目光转向更加轻量、灵活且免费扩展能力强的 VSCode。本篇文章将详细介绍,从 PyCharm 转向 VSCode 后,如何高效搭建和管理…...

系统架构-架构评估

质量属性 性能 指系统的响应能力 指标&#xff1a;响应时间、吞吐量等。 设计策略&#xff1a;优先级队列、增加计算资源、减少计算开销、引入并发机制、采用资源调度 可靠性 在意外或错误使用的情况下维持软件系统的功能特性 指标&#xff1a;MTTF、MTBF、MTTR 设计策…...