Hola.
Estuve analizando el ejercicio resuelto de la entrega CU00921C. Probándolo con algunos cambios obtuve resultados no satisfactorios cuyos motivos no logro explicar. Quisiera compartir esa experiencia.
Vamos al código:
La clase Programa tal como está en la entrega funciona correctamente. Los tiempos que aparecen por consola irán variando dependiendo de, no solo qué procesador uno tenga, si no también de "qué tan ocupado" esté el procesador al momento de ejecutarse el programa. Lo importante de ver en cada corrida del programa es la diferencia relativa de tiempos.
Ahora bien, supongamos que introducimos una modificación de orden al programa original.
Supongamos que la modificación consiste en: primero realizar la inserción de un elemento en la posición 0 de la lista listalinked, y luego la insersión de un objeto en posición 0 en la lista listaarray. Es decir, en vez de realizar primero la inserción en listaarray como lo hacía el programa original, empezamos por insertar en la lista listalinked.
Lo que uno esperaría es que los tiempos mantuvieran la misma diferencia relativa, pero no sucede así.
El programa codificado de esta manera muestra que la insersión en la lista listalinked será incluso hasta más lenta que en la lista listaarray.
Esto es lo que causa sorpresa. Uno hubiera esperado se mantuviera la diferencia relativa de tiempos insumidos por los procesos, y que principalmente el tiempo insumido por listalinked fuese menor que el tiempo insumido por listaarray.
Presumo tal vez que este comportamiento observado esté relacionado con otro tipo de cuestiones (externas) más que a la perfomance de los 2 tipos de implimentaciones analizadas (ArrayList y LinkedList).
(La siguiente es la clase modificada con el cambio ya explicado)
/* Ejemplo Interface List aprenderaprogramar.com */
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Programa {
public static void main(String arg[]) {
List<Persona> listaarray = new ArrayList<Persona>();
List<Persona> listalinked = new LinkedList<Persona>();
long antes;
for(int i=0;i<10000;i++)
{
listaarray.add(new Persona(i,"Persona"+i,i)); // En este ejemplo cada persona lleva datos ficticios
listalinked.add(new Persona(i,"Persona"+i,i));
}
System.out.println("Tiempo invertido en insertar una persona en listalinked (en nanosegundos):");
antes = System.nanoTime();
listalinked.add(0,new Persona(10001,"Prueba",10001)); // Inserción en posicion 0 de una persona
System.out.println(System.nanoTime()- antes);
System.out.println("Tiempo invertido en insertar una persona en listaarray (en nanosegundos):");
antes = System.nanoTime();
listaarray.add(0,new Persona(10001,"Prueba",10001)); // Inserción en posicion 0 de una persona
System.out.println(System.nanoTime()- antes);
}
}