Por lo general, lo mejor que hacer en la búsqueda anwers para este tipo de preguntas es ver cómo las decisiones son compiladas en bytecode JVM:
multi = new int[50][50];
single = new int[2500];
Esto se traduce en:
BIPUSH 50
BIPUSH 50
MULTIANEWARRAY int[][] 2
ASTORE 1
SIPUSH 2500
NEWARRAY T_INT
ASTORE 2
Entonces, como puede ver, , la JVM ya sabe que estamos hablando de una matriz multidimensional.
Manteniendo aún más:
for (int i = 0; i < 50; ++i)
for (int j = 0; j < 50; ++j)
{
multi[i][j] = 20;
single[i*50+j] = 20;
}
Esto se traduce (se pierden los ciclos) en:
ALOAD 1: multi
ILOAD 3: i
AALOAD
ILOAD 4: j
BIPUSH 20
IASTORE
ALOAD 2: single
ILOAD 3: i
BIPUSH 50
IMUL
ILOAD 4: j
IADD
BIPUSH 20
IASTORE
Así, como se puede ver, la matriz multidimensional es tratada internamente en la VM, sin gastos indirectos generados por instrucciones inútiles, mientras usa uno solo usa más instrucciones ya que el desplazamiento se calcula a mano.
No creo que el rendimiento sea un problema.
EDIT:
hice algunos puntos de referencia simples para ver lo que está pasando aquí. Elegí probar diferentes ejemplos: lectura lineal, escritura lineal, y acceso aleatorio. Los tiempos se expresan en milisegundos (y se calculan usando System.nanoTime()
. Éstos son los resultados:
lineal escribir
- Tamaño: 100x100 (10000) Multi: 5.786591 individual: 6.131748
- Tamaño: 200x200 (40000) Multi: 1.216366 individual: 0.782041
- Tamaño: 500x500 (250000) Multi: 7.177029 individual: 3,667017
- Tamaño: 1000x100 0 (1000000) Multi: 30.508131 individual: 18.064592
- Tamaño: 2000x2000 (4000000) Multi: 185.3548 individual: 155.590313
- Tamaño: 5000x5000 (25000000) Multi: 955.5299 individual: 923.264417
- Tamaño : 10000x10000 (100000000) Multi: 4084.798753 individual: 4015.448829
lineal leer
- Tamaño: 100x100 (10000) Multi: 5.241338 individual: 5,135957
- Tamaño: 200x200 (40000) Multi: 0.080209 individual: 0,044371
- Tamaño: 500x500 (250000) Multi: 0.088742 individual : 0.084476
- Tamaño: 1000x1000 (1000000) Multi: 0.232095 individual: 0.167671
- Tamaño: 2000x2000 (4000000) Multi : 0.481683 individual: 0,33321
- Tamaño: 5000x5000 (25000000) Multi: 1.222339 individual: 0.828118 Tamaño: 10000x10000 (100000000) Multi: 2.496302 individual: 1.650691
de lectura aleatoria
- Tamaño: 100x100 (10000) Multi: 22.317393 Single: 8.546134
- Tamaño: 200x200 (40000) Multi: 32.287669 individual: 11,022383
- Tamaño: 500x500 (250000) Multi: 189.542751 individual: 68,181343
- Tamaño: 1000x1000 (1000000) Multi: 1124.78609 individual: 272.235584
- Tamaño: 2000x2000 (4000000) múltiples: 6814.477101 individuales: 1091,998395
- Tamaño: 5000x5000 (25000000) Multi: 50051,306239 individual: 7028.422262
El azar es un poco engañoso ya que genera 2 números aleatorios para matriz multidimensional, mientras que solo uno para dimensión única (y los PNRG pueden consumir algo de CPU).
Ten en cuenta que traté de dejar que JIT funcione mediante la evaluación comparativa solo después de la 20ª ejecución del mismo ciclo. Para completar mi máquina virtual de Java es la siguiente:
java version "1.6.0_17" Java (TM) SE Runtime Environment (build 1.6.0_17-b04) Java HotSpot (TM) de 64 bits del servidor VM (construir 14.3-b01, modo mixto)
Ver también: http://stackoverflow.com/questions/2368761/performance-comparison-of-array-of-arrays-vs-multidimensional-arrays – polygenelubricants