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

合理布局结构体,精打细算 cacheline

突然想起多年前做的一个优化,相关的还涉及一个诡异的事,先看这两篇文字:保持内存紧凑性,快速路径慎用 kmalloc。

最近又遇到这类事,还是一样的原则,“一起经常被访问的字段要紧挨着放,尽量使它们处于同一个 cacheline”。看一个紧凑型的结构体:

#define CACHELINE_SIZE 128
#define ARRAY_SIZE 100000typedef struct {int a;int b;int c;int d;//char pad[256 - 16];char pad2[519 - 16];
} __attribute__((packed)) CompactStruct;

再看一个非紧凑型的:

#define CACHELINE_SIZE 128
#define ARRAY_SIZE 100000typedef struct {int a;char padding1[CACHELINE_SIZE - sizeof(int) + 1];int b;char padding2[CACHELINE_SIZE - sizeof(int) + 1];int c;char padding3[CACHELINE_SIZE - sizeof(int) + 1];int d;char padding4[CACHELINE_SIZE - sizeof(int) + 1];char pad2[3];
} __attribute__((packed)) ScatteredStruct;

执行下面的逻辑,哪个更快呢:

for (int i = 0; i < ARRAY_SIZE; i++) {sum += arr[i].a + arr[i].b + arr[i].c + arr[i].d;
}

结构体字段的布局也是门手艺。像 TCP 处理,比如在接收路径,会频繁访问 snd_cwnd,snd_una,snd_wnd,snd_nxt,…,那么就有必要让上述这些字段挨得近一些,而不是随意散布在结构体的任意位置。总之,这个优化是立竿见影的。

但这种优化是极度拧巴的体系结构相关,我就从公司的 x86_64 换到家里的 Apple M2,结构体宏定义就改了一大堆,站在程序的视角,它本不应该了解这么多东西,cache 是默默起作用的,但反过来,既然你想让 cache 起更大作用,那就必须理解它的细节,方能调教好它。

但要记住,这类优化措施一定是最后才要考虑的,远在算法优化和系统级优化之后,首先还是要考虑算法能不能更优,压缩大 O 数量级,其次要考虑系统能不能更优,比如锁,并行,再然后就是操作系统级别的,比如进程,线程,最后才是体系结构相关的优化,这也是一个自上而下的顺序,从你要解决问题的算法开始,到硬件结束。

浙江温州皮鞋湿,下雨进水不会胖。

http://www.xdnf.cn/news/2573.html

相关文章:

  • 设计并实现一个基于 Java + Spring Boot + MySQL 的通用多租户权限系统
  • 计算机网络-运输层(1)
  • 关闭浏览器的拼写检查
  • 低调使用,“黑神话”正确打开方式
  • Aloudata Agent 36 问,深度解惑!
  • 磁盘清理git gc
  • 服务器异地备份,服务器异地备份有哪些方法?
  • 记录学习记录学习《手动学习深度学习》这本书的笔记(九)
  • MVCC(多版本并发控制)
  • docker部署Mysql8一直密码错误记录
  • 实时操作系统在金融科技中的应用及未来展望
  • Coding Practice,48天强训(25)
  • [Jupyter Notebook]:Jupyter Notebook 安装教程(代码编辑器)
  • 【C++底层】底层的编译逻辑和过程
  • OnlyOffice Document Server 开发版:连接器使用-ARM和x86双模式安装指南
  • C盘清理实用技巧整理
  • 卡洛诗西餐厅,以“中式西餐”为核心战略
  • 如何理解promise 续一
  • 准确--如何在 Windows 上安装并管理多个 Python 环境
  • 【SpringMVC文件上传终极指南:从基础配置到云存储集成】
  • 在亚马逊云服务器上部署WordPress服务
  • Pikachu靶场-目录遍历
  • WPF-遵循MVVM框架创建图表的显示【保姆级】
  • 【学习笔记】计算机操作系统(一)—— 操作系统引论
  • dify实际开发中遇见的几个小问题
  • 基于ART光学跟踪系统打造具有开创性的人车互动VR解决方案
  • 产品经理面经(1)
  • 使用Nestjs, Bun 和 NCC 打造高效的 Node.js 应用构建流程
  • Shell脚本-while循环应用案例
  • Python入门基础