Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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游戏。(3d组块,但这并不重要,我想专注于单一维度,以简化任务) 我在考虑如何在没有HashMap的情况下存储块,但是使用某种数组,因为这是对性能敏感的代码,HashMap并不是理想的选择。我得出的结论是,具有起始/偏移的数组是理想的。为什么?块通常在一个组中,但这个组可以从一个非常大的或/和负数开始 情况示例: 现在,我对开始/偏移的意思最好用一个例子来描述 位置/要素 100000 / foo 100001 / bar 100002 / fo

上下文:

您好,我正在制作一个以地形为块的Java游戏。(3d组块,但这并不重要,我想专注于单一维度,以简化任务)

我在考虑如何在没有HashMap的情况下存储块,但是使用某种数组,因为这是对性能敏感的代码,HashMap并不是理想的选择。我得出的结论是,具有起始/偏移的数组是理想的。为什么?块通常在一个组中,但这个组可以从一个非常大的或/和负数开始

情况示例:

现在,我对开始/偏移的意思最好用一个例子来描述

位置/要素

100000 / foo
100001 / bar
100002 / foobar
我可以创建一个大小为3且偏移量为100000的数组,而不是创建一个大小为100003的数组。get方法看起来像:

int offset=...; //set as items are added but in this example it would be 100000
T[] data;

<T> T get(int pos){
  if(pos<offset || pos>=offset+data.length)return null;
  return data[pos - offset];
}
int offset=//已添加设置为项目,但在本例中为100000
T[]数据;
T获取(内部位置){
if(pos=offset+data.length)返回null;
返回数据[位置-偏移];
}
问题:

我已经体验到,以有效的方式执行这项任务是相当困难的。现在我想知道是否有任何方法可以通过java或库中的现有类来实现这一点


老实说,我不相信自己有这种性能敏感的代码。(主要处理数组大小和偏移量)

这或多或少是稀疏矩阵的要求


哦,哇,我从来没有想过要那样做。这是一个很好的解决方案,虽然不是一个完美的解决方案。不过,谢谢你!您是否使用HashMap实现了这一点,并注意到它太慢了?我不知道您的具体用例,但我怀疑使用块所花费的时间将使访问时间相形见绌,不管您是将其存储在映射还是数组中,因此我首先使用更易于使用的实现。如果您对代码进行了分析,并在这里看到了严重的速度减慢,那么将HashMap替换为实现
Map
接口的东西应该是微不足道的。@AndrewRueckert是的,与我“尝试实现”的偏移量的错误版本相比,访问时间缩短了约800%。当然,
HashMap
可能比数组慢十倍。这是很多,但您的处理过程不需要更多吗?++如果没有,那么像你这样的事情就好了。不要太担心性能,因为您无法真正预测它(没有人可以预测)。如果需要,可以使用JMH来衡量性能(几乎所有自制的基准测试都被严重破坏)。++如果你写了一个工作<代码> OffStRayLayList,考虑一下。trie可能只是很好,或者太普通/太慢。@maaartinus无处理根本不需要很长时间。(除了加载/创建块之外)例如,简单地调用opengl draw调用只需要很少的时间,而且我在使用哈希映射时遇到了不可接受的fps下降。