Java:循环列表两次消耗双倍功率?

时间:2012-05-22 15:19:55

标签: java list libgdx

使用LibGDX是一个使用MVC模式的例子。

updater看起来像这样

List<Enemies> enemies = new List<Enemies>();

public void update() {
updateEnemies();
checkCollision();
}

void updateEnemies() {
 for each enemy //Loop enemies list{
   enemy.update();
  }

}

void checkCollison(){
   for each enemy//Loop enemies list{
    if(enemy.overlaps(hero.bounds) {
       //Do stuff
    }
   }
}

现在它两次循环通过enemeies列表。我应该这样做吗?也许不是一个小清单,但我想添加大量的清单,所以我应该合并它们吗?

干杯!

6 个答案:

答案 0 :(得分:5)

迭代本身很便宜,不太可能成为任何性能问题的根源。但是,没有任何保证;如果您想了解程序的性能特征,请使用分析器。

答案 1 :(得分:2)

警告。在更新所有敌人时,他们都会占据新位置。然后检查碰撞。如果你要循环:更新一个敌人并检查碰撞,你会检查一些敌人的过时位置。这可能是无关紧要的。 java评论将按顺序排列://首先更新所有敌人:... //现在我们可以为新职位:。

作为答案:开销很小。

答案 2 :(得分:2)

从上面的代码可以看出,性能应该很好,因为你使用的循环是性能友好的:

for (Enemies enemy : enemies)
{
    //Do something here
}

根据this

答案 3 :(得分:0)

这样做的:

for each element in collection
   operationA();
   operationB();
end for

与基本相同的时间:

for each element in collection
   operationA();
end for
for each element in collection
   operationB();
end for

然而,第二个选项可能更清晰,因为每个循环都有一个特定的目标,而不是所有东西都在同一个循环中混合。

答案 4 :(得分:0)

理论上,一旦执行代码,编译器可能会将两个循环合并在一起,或者以更好的方式对其进行优化。有时事情并没有像他们看起来那样被完全执行。

答案 5 :(得分:0)

合并循环将引入新的开销,意外的间隔......相反,对于不同的方法使用相同的循环不会影响实践中的性能,它会使代码保持清晰,可读性和可维护性。如果使用这些方法,可以轻松处理每种方法捕获异常和其他自定义任务。