Java: ¿la lista de bucles consume dos veces el doble de potencia?

Con LibGDX viene un ejemplo que usa el patrón MVC.

el actualizador se parece a esto

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
    }
   }
}

Ahora recorre la lista de enemigos dos veces. ¿Debo hacer esto? Tal vez no sea una lista pequeña, pero quiero agregar muchas listas, ¿debería fusionarlas?

¡Aclamaciones!

preguntado el 22 de mayo de 12 a las 16:05

Quiero hacer algo similar pero no sé la respuesta, usé varias listas antes, pero sería bueno saber la respuesta:

Reduciría el tiempo si fusiona las acciones. Pero, ¿actualizas a menudo sin verificar las colisiones, o siempre haces ambas cosas? -

actualizar = actualizar el estado de la posición para que Collison colisione -

6 Respuestas

La iteración en sí es barata y es poco probable que sea la fuente de problemas de rendimiento. Sin embargo, nada está garantizado; si desea comprender las características de rendimiento de su programa, utilice un generador de perfiles.

contestado el 22 de mayo de 12 a las 16:05

Ten cuidado. Al actualizar a todos los enemigos, todos toman nuevas posiciones. Y luego se comprueban las colisiones. Si lo hiciera en un bucle: actualice un enemigo y verifique la colisión, verificaría las posiciones obsoletas de algunos enemigos. Esto puede ser irrelevante, o no. Un comentario de java estaría en orden: // Primero actualice todos los enemigos: ... // Ahora podemos para las nuevas posiciones: .

Como respuesta: los gastos generales son mínimos.

contestado el 22 de mayo de 12 a las 16:05

¿sobrecarga?... lo siento, ¿qué significa eso? - AndroidXTr3meN

Iba a escribir algo similar, hasta que me di cuenta de que el código solo verifica las colisiones con el héroe, cuya posición no parece ser cambiada por ninguno de los bucles. - NPE

AndroidXTr3meN: gastos generales = costos; muy pequeño como otros dijeron. Para @aix gracias por decir eso. - joop eggen

A partir del código anterior, se puede ver que el rendimiento debería ser bueno ya que el bucle que está utilizando es compatible con el rendimiento:

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

Según este.

contestado el 23 de mayo de 17 a las 11:05

Gracias, pero quise decir más si uso el bucle dos veces: AndroidXTr3meN

Lo mismo ocurrirá con los tiempos máximos, porque este tipo de bucle da más rendimiento en los otros tipos de bucle. así que no es discutible. - Cabeza de jengibre

Por supuesto, podría hacerlo de acuerdo con la accesibilidad de la GUI. - Cabeza de jengibre

Haciendo:

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

toma básicamente el mismo tiempo que hacer:

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

Sin embargo, la segunda opción puede ser más clara ya que cada bucle tiene un objetivo específico y no todo se mezcla en el mismo bucle.

contestado el 22 de mayo de 12 a las 16:05

Me resulta difícil de creer que lleva el mismo tiempo. Si mi colección es de 12 billones de artículos, será el doble. - Woot4moo

Estoy de acuerdo, tomaría más tiempo. Pero dependiendo del tamaño de la lista podría ser insignificante. - CM con cafeína

En realidad, n * (a + b) = n * a + n * b. ¡Puede haber un poco de sobrecarga si el tiempo de ejecución de una operación es MUY corto! - Juan Logeart

Bueno, estoy pensando que si los fusiono y amplío mi juego, podría arruinar el diseño y dejarlo poco claro. ¿o? - AndroidXTr3meN

Que podría. Todo lo que digo es que a menudo es mejor tener n bloques de código haciendo n cosas específicas que entiendes claramente y puedes mantener fácilmente que tener un bloque de código haciendo n cosas (¡y a veces mezclándolas!). Y eso es especialmente cierto si no hay problemas de rendimiento. - Juan Logeart

En teoría, una vez que se ejecuta el código, el compilador podría fusionar ambos bucles u optimizarlo de una mejor manera. A veces, las cosas no se ejecutan exactamente de la forma en que parecen estar juntas.

contestado el 22 de mayo de 12 a las 16:05

El compilador ejecuta el código desde la línea 0 hasta la última línea en orden. Al menos lo que he oído - AndroidXTr3meN

eso es lo que ve cuando lo depura, pero no lo que ve el compilador. - Basilio alemán

La combinación de bucles introducirá una nueva sobrecarga, intervalos inesperados... En cambio, usar los mismos bucles para diferentes métodos no afecta el rendimiento en la práctica, mantiene su código claro, más legible y fácil de mantener. La captura de excepciones y otras tareas personalizadas con cada método se puede manejar fácilmente si esos métodos.

contestado el 22 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.