En mis propias pruebas System.arraycopy() para copiar varias matrices de dimensión es 10 a 20 veces más rápido que el entrelazado de bucles:
float[][] foo = mLoadMillionsOfPoints(); // result is a float[1200000][9]
float[][] fooCpy = new float[foo.length][foo[0].length];
long lTime = System.currentTimeMillis();
System.arraycopy(foo, 0, fooCpy, 0, foo.length);
System.out.println("native duration: " + (System.currentTimeMillis() - lTime) + " ms");
lTime = System.currentTimeMillis();
for (int i = 0; i < foo.length; i++)
{
for (int j = 0; j < foo[0].length; j++)
{
fooCpy[i][j] = foo[i][j];
}
}
System.out.println("System.arraycopy() duration: " + (System.currentTimeMillis() - lTime) + " ms");
for (int i = 0; i < foo.length; i++)
{
for (int j = 0; j < foo[0].length; j++)
{
if (fooCpy[i][j] != foo[i][j])
{
System.err.println("ERROR at " + i + ", " + j);
}
}
}
Esta impresora:
System.arraycopy() duration: 1 ms
loop duration: 16 ms
@Peter, por lo que dentro de código nativo que puede encontrar con el modelo de memoria de Java? (Nunca he tenido ninguna causa para hacer una malarkey nativa) –
@James B, no soy un experto en esto, pero en el código nativo seguramente no estás obligado con el modelo de memoria Java ni nada, puedes jugar con la cruda bits de cualquier manera que desee (bajo su propio riesgo, por supuesto). –
En realidad, solo algunas subcategorías de 'arraycopy' podrían implementarse usando' memcpy'/'memmove'. Otros requieren una verificación del tipo de tiempo de ejecución para cada elemento copiado. –