优化 Java 对象以提高 CPU 缓存线效率

2024-02-29

我正在写一个库,其中:

  • 它将需要运行在广泛的不同平台/ Java 实现(常见情况可能是运行 Windows 或 Linux 的 Intel 64 位计算机上的 OpenJDK 或 Oracle Java)
  • 实现高性能是首要任务,就我关心对象访问中的CPU缓存线效率而言
  • 在某些地区,相当小物体的大图将被遍历/处理(假设大约 1GB 规模)
  • 主要工作量是几乎只阅读
  • 阅读会分散跨越对象图,但不是完全随机的(即会有显着的热点,​​偶尔会读取不经常访问的区域)
  • 对象图将是同时访问(但未修改)由多个线程。假设不会发生并发修改,则不存在锁定。

是否有一些设计小对象的经验法则/指南,以便它们在这种环境中有效地利用 CPU 缓存线?

我对正确调整对象的大小和结构特别感兴趣,以便例如最常访问的字段适合第一个缓存行等。

Note: I am 充分意识这是依赖于实现的,我需要进行基准测试,以及过早优化的一般风险。无需再浪费任何带宽来指出这一点。 :-)


提高缓存行效率的第一步是提供引用局部性(即保持数据彼此靠近)。这在 JAVA 中很难做到,因为几乎所有东西都是系统通过引用分配和访问的。

为了避免引用,以下内容可能是显而易见的:

  1. 将非引用类型(即 int、char 等)作为字段 物体
  2. 将对象保存在数组中
  3. 保持你的物体小

这些规则至少可以确保在处理单个对象以及遍历对象图中的对象引用时具有一定的引用局部性。

另一种方法可能是根本不使用对象来存储数据,而是为每个项目使用全局非引用类型数组(大小相同),这些项目通常是类中的字段,然后每个实例将由公共索引标识到这些数组中。

然后,为了优化数组或其块的大小,您必须了解 MMU 特性(页面/缓存大小、缓存行数等)。我不知道 JAVA 是否在系统或运行时类中提供此信息,但您可以在启动时将此信息作为系统属性传递。

当然,这与您通常在 JAVA 中应该做的事情完全正交:)

此致

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化 Java 对象以提高 CPU 缓存线效率 的相关文章

随机推荐

  • 函数 try 块是否允许我们解决异常?

    所以我正在阅读有关函数 try 块的内容link https www learncpp com cpp tutorial 14 7 function try blocks 还有一行描述了普通 try 块和函数 try 块之间的区别 如下所示
  • 一次性登录应用程序 - FirebaseAuth

    我正在开发一个使用 Firebase 身份验证通过电话号码登录用户的应用程序 我想添加一项功能 使用户只能一次性登录 即即使用户杀死应用程序并再次启动它 他也应该登录 另外 我不想添加注销功能 为此可以做什么 实现此目的的最简单方法是使用侦
  • java LocalDateTime 解析具有模式 MM/d/yyyy HH:mm:ss a 的日期的异常

    我在使用 java datetime API 执行下面的代码时遇到异常 String strDate 12 4 2018 5 26 28 PM DateTimeFormatter formatter DateTimeFormatter of
  • Spring 3 表达式语言如何与属性占位符交互?

    Spring 3 引入了新的表达语言 http docs spring io spring docs 3 0 x spring framework reference html expressions html SpEL 可以在 bean
  • 如何检测产品搜索中的拼写错误并提出可能的更正建议?

    给定一个非常大的产品名称数据库 您如何检测用户搜索中可能存在的拼写错误并建议可能的更正 有点像谷歌呈现它们的方式 E g 用户输入 fork handels 并按 搜索 他们回来了 没有结果 您是说 叉柄 吗 解决这个问题有几种方法 保留一
  • G++ 找不到 boost 库。我说他们就在众目睽睽之下

    我正在尝试构建一些代码 这是我收到的错误 main o In function static initialization and destruction 0 home jmbeck Downloads boost 1 48 0 boost
  • Visual Studio 2013 缺少转换为 Web 应用程序

    我正在管理一个旧的 Web 应用程序 它仍然具有 Framework 1 的遗留代码 你相信吗 目前使用 Framework 4 0 当我需要修复或升级网页时 我通过单击 转换为 Web 应用程序 将其转换为 Web 应用程序网页 VS 2
  • order Graphviz - 固定子图

    我喜欢创建一个像这样的 3 柱形图 Code digraph g rankdir LR node shape circle fontsize 14 fontsize 18 labeljust l rank same edge style i
  • Docker 容器超时?

    对于我在大学的论文 我正在研究一个编码排行榜系统 用户可以通过临时 Docker 容器编译 运行不受信任的代码 到目前为止 系统似乎运行良好 但我面临的一个问题是 当提交无限循环的代码时 例如 while True print infini
  • Twitter 回调 URL

    我正在使用 twitter SDK 与 ios 应用程序集成 当我遵循所有步骤并创建客户密钥并将其放入我的应用程序中时 当我运行应用程序时 它会显示 TwitterKit 确实遇到了消息错误 获取用户身份验证令牌时出错 错误域 TWTRLo
  • 如何在我自己的 C shell 中正确等待前台/后台进程?

    In this https stackoverflow com questions 873620 how do i clear this array pointer in c上一个问题我发布了大部分我自己的 shell 代码 我的下一步是实
  • 从子查询更新多列

    此类问题之前已被问过几次 但并不完全是我想要的 我需要SET两行等于子查询的不同部分 我目前正在使用 UPDATE records SET leads SELECT COUNT FROM leads table WHERE leads ta
  • 替换字符串中的字符列表

    我有一个字符串 它是网页的标题 所以它可以有 和其他特殊字符 我想编写一个函数 它将接受一个字符串并替换一个字符列表 试图找到最好的方法来做到这一点 我应该使用列表 数组或枚举来保存特殊字符列表 还是 java 中已经有一些东西可以做到这一
  • 如何使单选按钮看起来像切换按钮

    我希望一组单选按钮看起来像一组切换按钮 但功能仍然像单选按钮一样 它们不必看起来完全像切换按钮 我怎样才能只使用 CSS 和 HTML 来做到这一点 编辑 当选中 取消选中按钮时 我会满意地使小圆圈消失并更改样式 根据您想要支持的浏览器 您
  • 具有取消支持的 GetContextAsync()

    所以我正在旋转一个HttpListener等待一个OAuth2回复 在理想的情况下 当用户登录浏览器并且我们收到令牌时 该令牌只会存活几秒钟 我也希望这个有一个CancellationToken以便用户可以在延迟后停止收听 如果他们愿意 我
  • 迭代器块的测试覆盖率结果很奇怪,为什么这些语句没有执行?

    我正在使用 dotCover 来分析单元测试的代码覆盖率 并且得到一些奇怪的结果 我有一个迭代器方法 其覆盖范围不完整 但未覆盖的语句只是右大括号在该方法的末尾 这是我正在测试的方法 public static IEnumerable
  • 尝试将二进制文件部署到已存储不同二进制文件的位置

    当我从 tridio 2009 发布页面时 出现以下错误 Destination with name FTP Host servername Location RET Password Port 21 UserName retftp rep
  • 在spark中连接mongodb时出现异常

    在尝试使用 MongoDB 作为输入 RDD 时 我在 org bson BasicBSONDecoder decode 中收到 java lang IllegalStateException 未就绪 Configuration conf
  • Android:如何在 java 类中创建 EditText 字段

    我只是想知道如何通过单击按钮创建 editText 字段 是否可以 我在网上找不到任何东西 如果有人知道如何做到这一点 请回答 如果您知道如何配置尺寸 放置等也包括该信息 import android widget Button impor
  • 优化 Java 对象以提高 CPU 缓存线效率

    我正在写一个库 其中 它将需要运行在广泛的不同平台 Java 实现 常见情况可能是运行 Windows 或 Linux 的 Intel 64 位计算机上的 OpenJDK 或 Oracle Java 实现高性能是首要任务 就我关心对象访问中