Voici mon code de référence:
public void test(int copySize, int copyCount, int testRep) {
System.out.println("Copy size = " + copySize);
System.out.println("Copy count = " + copyCount);
System.out.println();
for (int i = testRep; i > 0; --i) {
copy(copySize, copyCount);
loop(copySize, copyCount);
}
System.out.println();
}
public void copy(int copySize, int copyCount) {
int[] src = newSrc(copySize + 1);
int[] dst = new int[copySize + 1];
long begin = System.nanoTime();
for (int count = copyCount; count > 0; --count) {
System.arraycopy(src, 1, dst, 0, copySize);
dst[copySize] = src[copySize] + 1;
System.arraycopy(dst, 0, src, 0, copySize);
src[copySize] = dst[copySize];
}
long end = System.nanoTime();
System.out.println("Arraycopy: " + (end - begin) / 1e9 + " s");
}
public void loop(int copySize, int copyCount) {
int[] src = newSrc(copySize + 1);
int[] dst = new int[copySize + 1];
long begin = System.nanoTime();
for (int count = copyCount; count > 0; --count) {
for (int i = copySize - 1; i >= 0; --i) {
dst[i] = src[i + 1];
}
dst[copySize] = src[copySize] + 1;
for (int i = copySize - 1; i >= 0; --i) {
src[i] = dst[i];
}
src[copySize] = dst[copySize];
}
long end = System.nanoTime();
System.out.println("Man. loop: " + (end - begin) / 1e9 + " s");
}
public int[] newSrc(int arraySize) {
int[] src = new int[arraySize];
for (int i = arraySize - 1; i >= 0; --i) {
src[i] = i;
}
return src;
}
De mes tests, appelant test()
avec copyCount
= 10000000 (1e7) ou plus permet le warm-up pour être réalisée lors de la première copy/loop
appel, donc à l'aide d' testRep
= 5 est assez; Avec copyCount
= 1000000 (1e6) le warm-up besoin d'au moins 2 ou 3 itérations afin testRep
doit être augmenté afin d'obtenir des résultats utilisables.
Avec ma configuration (PROCESSEUR Intel Core 2 Duo E8500 @ 3.16 GHz, Java SE 1.6.0_35-b10 et Eclipse 3.7.2) il ressort de l'indice de référence qui:
- Lors de l'
copySize
= 24, System.arraycopy()
"et le" manuel de la boucle de prendre presque dans le même temps (parfois on est très légèrement plus vite que les autres, d'autres fois c'est le contraire),
- Lors de l'
copySize
< 24, le manuel de la boucle est plus rapide que l' System.arraycopy()
(un peu plus rapide avec copySize
= 23, vraiment plus rapide avec copySize
< 5),
- Lors de l'
copySize
> 24, System.arraycopy()
est plus rapide que le manuel de la boucle (un peu plus rapide avec copySize
= 25, le ratio de la boucle en temps/arraycopy-temps, la demande croissante en tant que copySize
augmente).
Note: je ne suis pas anglais langue maternelle, s'il vous plaît excusez tous mes grammaire/vocabulaire des erreurs.