Nei miei test System.arraycopy () per la copia di array a più dimensioni è da 10 a 20 volte più veloce dell'interleaving per i loop:
float[][] foo = mLoadMillionsOfPoints();
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);
}
}
}
Questo stampa:
System.arraycopy() duration: 1 ms
loop duration: 16 ms
arraycopy
potrebbero essere implementate usandomemcpy
/memmove
. Altri richiedono un controllo del tipo di runtime per ogni elemento copiato.