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

时间:2013-05-27 22:43:17

标签: 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是否有能力执行20次连续的简单数组写操作,速度与执行10或2的速度一样快?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

实际的过程或读写数组的20个元素应该不是很大的性能问题,尽管它取决于代码的性能如何。 我会尝试实现你必须看看它是否符合你的要求,我相信数组数据结构应该足够快,以便用Java完成大多数性能优化的任务。

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