java - 存储和更新隐式信息(数组、Java)的性能损失

标签 java arrays performance

我正在编写一些性能关键的 Java 代码,但提前声明一下,我确实不是 Java 专家。

我使用的模型中,几乎所有信息都可以根据约 1000 个整数(其中大多数为零)的变化数组中非零条目的位置来计算。为了减少这些计算,我正在研究算法,当数组发生变化时,它会在恒定的时间内更新信息,而不是重新计算它们。这可能会导致很多类似的代码

...
info1[x][y][a] = ...
info1[x][x%2+y][b] = ...
if( info3[x][y][c]!=0 )
    info2[x][y] = ...
if( some condition involving ~10 array entries) {
/** some expensive algorithm that is hopefully called rarely **/
}
info3[x][y] = ...
...

所以我预计可能会有 10 个这样的连续且主要独立的数组写入,并且计算量最少,这将构成程序必须运行的行的很大一部分。我是否应该预期此类简单连续操作的数量是相关的,或者 Java 是否有办法以执行 10 或 2 次的速度执行 20 个连续的简单数组写入?

最佳答案

不太清楚您的问题是什么,所以我将介绍几点:

  • 数组写入仅比数组读取慢一点。感兴趣的操作是 (a) 数组边界检查、(b) 数组索引计算(基本上乘以 4 - 微不足道)以及实际加载/存储。
  • 在单个直线代码块中拥有多个(数量“N”)短数组赋值语句不是问题。最坏的情况下,它的工作量是单个语句的 N 倍。
  • 拥有“深度”多维数组也没什么大不了的 - 如果您有一个 3 维数组,例如,存储看起来像是 2 个数组读取和一个写入。
  • 对于所有这些场景,JITC 都会“喜欢”简单的数组密集型代码。有很多机会进行“常见”数组边界检查、数组索引计算等,甚至平庸的 JITC 也会在这方面做得很好。
  • 对于非常大的数组和长时间运行的代码,您需要注意的一件事是内存占用,特别是在使用多线程时。对非常大(多兆字节)数组进行“稀疏”更新会“弄脏”大量缓存行和虚拟内存页,并且对于多线程情况,缓存同步(如果您设法安排它)可以成为一个瓶颈。但对于只有几千个数组条目来说,这根本不是问题。

关于java - 存储和更新隐式信息(数组、Java)的性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16781436/

相关文章:

java - 创建 EntityManagerFactory 时,Hibernate 不断删除/创建表

java - 设置自定义 XOM EntityResolver

java - 如何在 Java 中使用正则表达式找到确切的单词?

javascript - 使用 Vue.JS v-bind :class with conditional statement of dynamically created array

php - 分解数据库字符串并将值与php中的另一个字符串进行比较

java - 在java中的项目数组中查找最昂贵的项目

c# - Entity Framework - 性能计数

java - SpeechRecognizer onResults 未触发

c++ - 通过修改二进制搜索算法来改进它,使其在大量单词(单词列表)中搜索单词时工作得更快

javascript - 在每个页面上都包含 javascript 文件吗?