Dans mes propres tests System.arraycopy() pour copier des tableaux de dimensions multiples est 10 à 20 fois plus rapide que pour les boucles entrelacer:
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);
}
}
}
Cette impression:
System.arraycopy() duration: 1 ms
loop duration: 16 ms
@Peter, dans un délai de code natif, vous pouvez vous frayer avec le modèle de mémoire Java? (Je n'ai jamais eu aucune raison de faire un malarkey natif) –
@James B, je ne suis pas un expert en la matière, mais en code natif, vous n'êtes sûrement pas contraint avec le modèle de mémoire Java ou quoi que ce soit - vous pouvez bricoler bits comme vous le souhaitez (à vos risques et périls, bien sûr). –
En fait, seules certaines sous-classes de 'arraycopy' pourraient être implémentées en utilisant' memcpy'/'memmove'. D'autres nécessitent une vérification du type d'exécution pour chaque élément copié. –