簡體   English   中英

如何有效地遍歷大列表?

[英]How do I efficiently iterate through a big list?

我想制作一個像 Minecraft 這樣的開放世界 2D 游戲,並在 Chunks 中加載世界(就像 MC 一樣),大小為 16x16 塊(總共 256 個塊)。 但是我通過迭代 256 次發現,使用這樣的代碼完全迭代需要將近 20 毫秒:

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

由於我不僅要打印數字,還要獲取一個塊,獲取它的紋理並將該紋理繪制到框架上,我擔心迭代可能需要更長的時間。 也許我只是誇大了一點,但有沒有辦法更快地迭代?

不是需要 20ms 的迭代,而是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);

因此,首先,請考慮到通常不認為具有 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 毫秒。

如果這種方法不適合您的需求,那么您需要像其他評論所說的那樣做,考慮並行遍歷列表的不同部分,可能轉向不同類型的遍歷甚至不同類型的結構。

希望這可以幫助。

您應該問問自己是否真的需要完成所有這些工作。 例如,您是否需要繪制相機看不到的東西? 當然不是,因此排除該塊中位於相機矩形之外的每個塊。

過濾掉看不見的塊意味着一些開銷,但與在每次渲染更新時繪制塊中的每個塊相比,它通常是值得的,因為繪制內容是一項非常繁重的操作。

如果您只想加快遍歷速度,您可以生成並行遍歷塊的線程或購買更好的硬件。 但是最好從如何以更少的工作量獲得相同結果的問題開始。

另一方面,您的計算機應該能夠毫無問題地繪制 256 個紋理,尤其是在 GPU 上完成時。 所以也許在進行過早優化之前做一些測試。

附注。 您真正想要優化的並不是遍歷本身,而是每次迭代中完成的工作。 只需迭代 256 次就會非常快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM