我正在编写一些性能关键的 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/