Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储和更新隐式信息的性能损失(数组、Java)_Java_Arrays_Performance - Fatal编程技术网

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

存储和更新隐式信息的性能损失(数组、Java),java,arrays,performance,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]

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

一个数组的实际进程或读写20个元素不应该是性能问题,尽管这取决于代码对性能的重要性。 我会尝试实现,看看它是否满足您的要求,我相信数组数据结构应该足够快,可以满足大多数用Java完成的性能优化任务


资料来源:最近正在为大学工作重新实施ArrayList。

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

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

我想到的第一件事-使用
线程(特别是在数据不相关的情况下)任务已经在一个更大的环境中并行,我希望用于此任务的机器不会超过4个内核。在标准桌面PC上,阵列写入所需时间不到5纳秒(即每秒可以执行2亿次写入)。所以20次呼叫与2次呼叫意味着100纳秒与10纳秒。提高性能的方法是将数组展平(而不是使用
int[10][10][10]
,而是使用
int[1000]
并手动计算正确的索引)。一句话:概述你的应用程序。你正落入“提前优化”的陷阱。实现一些有效的方法,如果出现性能问题,请分析您的代码,只有这样,才能为性能编写一些特殊的代码。感谢您的警告,但对于我确信性能至关重要的任务,在不兼容的方法之间进行选择时,这些信息非常重要,因为该程序在大约10^x的时间内除此之外什么都不做,并且必须与其他程序竞争相同的性能目的。