No tengo nada sustancial para agregar a la respuesta de ruakh, pero aquí hay una función de prueba rápida. Mantengo un proyecto de chatarra para escribir pequeñas pruebas como estas. Ajuste el tamaño de fuente a algo representativo de sus datos, y puede obtener una idea aproximada de la magnitud del efecto. Como se muestra, vi un factor de 2 entre ellos.
import java.util.ArrayList;
import java.util.Random;
public class ALTest {
public static long fill(ArrayList<Byte> al, byte[] source) {
long start = System.currentTimeMillis();
for (byte b : source) {
al.add(b);
}
return System.currentTimeMillis()-start;
}
public static void main(String[] args) {
int sourceSize = 1<<20; // 1 MB
int smallIter = 50;
int bigIter = 4;
Random r = new Random();
byte[] source = new byte[sourceSize];
for (int i = 0;i<bigIter;i++) {
r.nextBytes(source);
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>(sourceSize);
time += fill(al,source);
}
System.out.print("With: "+time+"ms\t");
}
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>();
time += fill(al,source);
}
System.out.print("Without: "+time+"ms\t");
}
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>();
time += fill(al,source);
}
System.out.print("Without: "+time+"ms\t");
}
{
long time = 0;
for (int j = 0;j<smallIter;j++) {
ArrayList<Byte> al = new ArrayList<Byte>(sourceSize);
time += fill(al,source);
}
System.out.print("With: "+time+"ms");
}
System.out.println();
}
}
}
Salida:
With: 401ms Without: 799ms Without: 731ms With: 347ms
With: 358ms Without: 744ms Without: 749ms With: 342ms
With: 348ms Without: 719ms Without: 739ms With: 347ms
With: 339ms Without: 734ms Without: 774ms With: 358ms
Cuando se alcanza la capacidad de la ArrayList, CLR crea un nuevo ArrayList con el doble de capacidad de la original y copia todos los elementos de la de origen a la recién creada uno. Por lo tanto, puede guardar este trabajo adicional preestableciendo el tamaño de ArrayList si tiene alguna idea relacionada con el tamaño requerido. –
@Deepansh: ¿No es esta una pregunta de Java? ¿Cómo CLR entró en la imagen? ¿Supongo que te refieres a JVM? Además, su descripción parece correcta pero "en CLR" (.Net), toma más tiempo cuando preasignan el tamaño. Al menos, esto es lo que sucede cuando lo probé en 1000000 artículos. ¡Lo probé por 10-15 veces y cada vez que ganó el constructor predeterminado ArrayList! – TCM
Dije ArrayList, pero puede aplicarse al concepto en general de tener una vista de lista de una colección respaldada internamente por una matriz. – Maverick