如何有效地遍历大清单?

时间:2018-12-22 16:43:41

标签: java arrays iteration

我想制作一个像游戏一样的开放世界2D Minecraft,并以16x16块(总共256个块)的大小在块中加载世界(就像MC)。但是我通过迭代256次发现,用这样的代码完全迭代大约需要20毫秒:

long time = System.nanoTime();
for(int i = 0; i < 16*16; i++)
{
    System.out.println(i);
}
System.out.println(System.nanoTime() - time);

由于我不仅要打印数字,而且要得到一个块,获取纹理并将其绘制到框架上,所以我担心迭代可能需要更长的时间。也许我只是夸大了一点,但是有没有办法更快地迭代呢?

3 个答案:

答案 0 :(得分:1)

不是20分钟的迭代,而是println();。 以下将更快:

long time = System.nanoTime();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 16*16; i++)
{
    sb.append(i + System.getProperty("line.separator"));
}
System.out.println(sb);
System.out.println(System.nanoTime() - time);

答案 1 :(得分:0)

因此,首先,请考虑到一般认为256个列表的大小不大。

耗费时间的主要事情不是遍历列表而是使用System.out.println()。打印到控制台(或任何I / O操作)往往比其他指令花费更长的时间。

当我在本地尝试您的代码时,我大约会花费6毫秒,但是如果我做这样的事情:

    long secondStart = System.nanoTime();
    StringBuffer stringBuffer = new StringBuffer();
    for(int i = 0; i < 16*16; i++)
    {
        stringBuffer.append(i);
        stringBuffer.append("\n");
    }
    System.out.println(stringBuffer);
    System.out.println(System.nanoTime() - secondStart);

我得到0.5毫秒。

如果该方法不适合您的需求,那么您将需要按照其他意见所述进行操作,请考虑并行遍历列表的不同部分,或者转向另一种遍历甚至是另一种结构。 / p>

希望这会有所帮助。

答案 2 :(得分:0)

您应该问自己是否真的需要做所有的工作。例如,您需要画一些相机看不到的东西吗?当然不是,因此请排除该摄影机区域之外的该块中的每个块。

过滤掉看不见的块意味着一些开销,但是与绘制每个渲染更新中的块中的每个块相比,这通常是值得的,因为绘制工作相当繁重。

如果只想加快遍历速度,则可以生成并行并行遍历块的线程或购买更好的硬件。但是最好从一个问题开始,即如何用更少的工作就能达到相同的结果。

另一方面,您的计算机应该应该能够绘制256个纹理而不会出现问题,尤其是在GPU上完成时。因此,也许在进行过早的优化之前进行一些测试。

PS。您实际上并不是要优化的遍历本身,而是每次迭代中完成的工作。只需重复256次就会很快。