0

我正在编写一些性能关键的 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 有办法执行 20 次连续的简单数组写入,其速度与执行 10 或 2 次一样快?

4

2 回答 2

1

不完全清楚你的问题是什么,所以我将介绍几点:

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

实际过程或读取和写入数组的 20 个元素应该不是性能问题,尽管它取决于代码对性能的关键程度。我会尝试你必须看到的实现,看看它是否满足你的要求,我相信数组数据结构应该足够快,以完成在 Java 中完成的大多数性能优化任务。

资料来源:最近致力于为大学工作重新实现 ArrayList。

于 2013-05-27T22:53:56.220 回答