调整 Java 类以提高 CPU 缓存友好性

2024-05-22

在设计java类时,对于实现CPU缓存友好性有哪些建议?

到目前为止我学到的是应该尽可能多地使用 POD(即 int 而不是整数)。这样,在分配包含对象时,数据将被连续分配。例如。

class Local
{
    private int data0;
    private int data1;
    // ...
};

比缓存更友好

class NoSoLocal
{
    private Integer data0;
    private Integer data1;
    //...
};

后者将需要对可以位于内存中任意位置的 Integer 对象进行两次单独的分配,尤其是。 GC 运行后。 OTOH 在数据可以重用的情况下,第一种方法可能会导致数据重复。

有没有办法让它们在内存中彼此靠近,以便父对象及其包含元素将立即位于 CPU 缓存中,而不是任意分布在整个内存上,并且 GC 会将它们保持在一起?


您不能强制 JVM 将相关对象放置得彼此靠近(尽管 JVM 会尝试自动执行此操作)。但有一些技巧可以使 Java 程序对缓存更加友好。

让我向您展示一些现实项目中的例子。

BEWARE!这不是推荐的 Java 编码方式!
除非您完全确定为什么要这样做,否则不要采用以下技术。

  1. 继承优于组合。你肯定听说过相反的原则“优先考虑组合而不是继承” https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance。但对于构图,你有一个额外的参考可以遵循。这对于缓存局部性不利,并且还需要更多内存。经典的例子是继承优于组合是扩展实用程序的 JDK 8 加法器和累加器类Striped64班级。

  2. 将结构数组转换为数组结构。这再次有助于节省内存并加速单个字段的批量操作,例如关键查找:

    class Entry {
        long key;
        Object value;
    }
    
    Entry[] entries;
    

    将被替换为

    long[] keys;
    Object[] values;
    
  3. 通过内联扁平化数据结构。我最喜欢的例子是内联 160 位 SHA1 哈希,表示为byte[]。之前的代码:

    class Blob {
        long offset;
        int length;
        byte[] sha1_hash;
    }
    

    之后的代码:

    class Blob {
        long offset;
        int length;
        int hash0, hash1, hash2, hash3, hash4;
    }
    
  4. Replace String with char[]。你知道,String在Java中包含char[]引擎盖下的对象。为什么要为额外的参考而付出性能损失?

  5. 避免链接列表。链表对缓存非常不友好。硬件最适合线性结构。LinkedList经常可以替换为ArrayList。经典之作HashMap可以替换为打开地址哈希表 http://en.wikipedia.org/wiki/Open_addressing.

  6. 使用原始集合。 Trove http://trove.starlight-systems.com/是一个高性能库,包含原始类型的专用列表、映射、集合等。

  7. 在数组或字节缓冲区之上构建您自己的数据布局。字节数组是完美的线性结构。为了获得最佳的缓存位置,您可以手动将对象数据打包到单个字节数组中。

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

调整 Java 类以提高 CPU 缓存友好性 的相关文章

  • Java - 为什么不允许 Enum 作为注释成员?

    It says 原始 String Class an Enum 另一个注释 上述任何一个的数组 只有这些类型才是合法的 Annotation 成员 为什么泛型 Enum 不能成为 Annotation 的成员 例如 Retention Re
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • 垃圾收集最佳实践

    如果您要从显示列表中删除某个 MovieClip 并且该 MovieClip 又具有具有自己的事件侦听器的子 MovieClip 则是否有必要从子 MovieClip 中删除所有侦听器 或者只是直接从显示列表中删除的父级 MovieClip
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 如何在selenium服务器上提供自定义功能?

    我知道可以通过某种方法获得一些硒功能 其中之一如下 driver getCapabilities getBrowserName 它返回浏览器名称的值 但如果它指的是一个可用的方法 如果我没有误解的话 这似乎与自定义功能有关 就像我的意思是
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • 为什么这个作业不起作用?

    我有课Results which extends ArrayList
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • hashcode 的默认实现为以相同方式构造的对象返回不同的值

    我在这里编写一个示例代码 public class Test private int i private int j public Test TODO Auto generated constructor stub public Test
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • pyqt4窗口调整大小事件

    我正在使用 python3 和 pyqt4 我希望每次运行时都会运行一些代码QMainWindow已调整大小 我想要这样的东西 self window resized connect self resize but resized不是内置函
  • Prolog中如何选择bagof、setof和findall

    如何在 bagof setof 和 findall 之间做出选择 有什么重要的区别吗 哪个最常用 哪个最安全 感谢您的评论 回答 我检查了SWI Prolog 手册页findall 3 http www swi prolog org pld
  • 在 Tensorflow 中每行选择一个元素的优雅方法

    Given 一个矩阵A形状的 m n 张量I形状的 m 我想要一份清单J的元素来自A where J i A i I i 那是 I保存要从每行中选择的元素的索引A 背景 我已经有了argmax A 1 现在我也想要max 我知道我可以使用r
  • ZF2 将自定义属性添加到选择表单元素中的选项

    我想将自定义 HTML 属性添加到 Zend Framework 2 表单中的选择选项中 这是我的 Form 类中的 部分 代码 this gt add array name gt lieuRemplissage type gt Selec
  • javascript 多维类型数组 (Int8Array) 示例

    我尝试使用类型数组而不是数组来减少内存 function createarrayInt8 numrows numcols number var arr new Int8Array numrows for var i 0 i lt numro
  • 这个灰色的 git 图标是什么?

    看起来像文件夹中的文件夹 或者可能是一把锁 该文件无法打开 并且其中似乎没有任何内容 我确实知道的一件事是 这个文件夹本身就是一个存储库 位于存储库内部 考虑到它是一个子模块 https stackoverflow com a 191318
  • 如何在调整大小时更改 JLabel 字体大小以填充 JPanel 可用空间?

    这里有一个类似的问题 如何更改 JLabel 的字体大小以获取最大大小 https stackoverflow com questions 2715118 how to change the size of the font of a jl
  • 使用 selenium 和 firefox 保存图像

    我正在尝试使用 selenium 服务器和 python 客户端从网站保存图像 我知道图像的 URL 但我无法找到保存它的代码 无论是当它是文档本身还是当它嵌入到当前浏览器会话中时 到目前为止我找到的解决方法是保存页面的屏幕截图 有两种硒方
  • UIScrollView 总是弹回来

    我将一堆对象放入 UIScrollView 中 没有任何问题 当我尝试 滚动 到某些屏幕外对象时 只要我在拖动手指后按住手指 它们就会出现 但是当我让你 UIScrollView 弹回到原始位置 有办法防止这种情况吗 顺便说一句 当发生这种
  • 以编程方式卸载 Android 应用程序

    我希望能够允许我的用户从我的应用程序中卸载应用程序 就像 Google Play 商店允许其用户一样 请下图 主要问题是如何定义一个按钮 按下它我们可以通过提供包名称或其他一些信息来卸载应用程序 就像图像上的卸载按钮一样 try Inten
  • 如何在 django-crispy-forms 中将表单字段分布在两列布局上?

    我收到了一些使用 django crispy forms 在 Django 中创建表单的建议 我已经在文档中寻找了几个小时 但无法找出如何将表单字段分布在两列上的方法 看这个例子here https gist github com 1838
  • 如何检查浏览器是否支持 WebAssembly?

    随着所有新的主要浏览器都支持 WebAssembly 我如何检查当前访问我网站的浏览器是否支持它 有几种方法可以检测 WebAssembly 的存在 基本的一个是检查是否WebAssembly如果类型 object 在全局作用域中 但是在不
  • 如何使用httplib2进行相互证书认证

    我正在使用 httplib2 从我的服务器向另一个 Web 服务发出请求 我们想要使用相互证书身份验证 我了解如何使用证书进行传出连接 h set certificate 但是如何检查应答服务器使用的证书 这张票 http code goo
  • 如何在 html 画布上使文本适合精确的宽度?

    如何在 html5 画布上将单行文本字符串调整为精确的宽度 到目前为止我尝试过的是以初始字体大小编写文本 测量文本的宽度measureText my text width 然后根据我想要的文本宽度和实际文本宽度之间的比例计算新的字体大小 它
  • Delphi + Synapse:如何检查我是否仍然连接

    我在用TTCPBlockSocket http synapse ararat cz doc help blcksock TTCPBlockSocket html对于 TCP IP 应用程序 问题是我无法确定连接何时丢失 GetLastErr
  • iOS模型层通知Controller对象

    https developer apple com library archive documentation General Conceptual DevPedia CocoaCore MVC html https developer a
  • 为什么 AngularJS 指令(属性等)在 WebStorm 8 中显示为“无效”?

    我几个小时前刚刚安装了 WebStorm 8 我一直在写一些 AngularJS 的东西 但我有一个相当烦人的小问题 AngularJS 插件似乎只能部分工作 每当我输入 ng 时 我都会收到一个智能感知弹出窗口 其中显示所有各种 ng 属
  • 如何使用谷歌知识图谱API

    目前我可以通过哪些有用的方式使用 Google Knowledge Graph API 假设我有 MID1990 FIFA World Cup 即 m 014nm 我提出这个要求 GET MY API KEY 我会得到这样的东西http p
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • 调整 Java 类以提高 CPU 缓存友好性

    在设计java类时 对于实现CPU缓存友好性有哪些建议 到目前为止我学到的是应该尽可能多地使用 POD 即 int 而不是整数 这样 在分配包含对象时 数据将被连续分配 例如 class Local private int data0 pr