On dirait list.clear() sera plus lent,
Pas toujours. Clear() doit effacer les références que vous avez utilisées, mais lorsque vous créez un nouvel objet, il doit effacer la mémoire de l'objet avant de pouvoir l'utiliser.
qui dans le second cas, GC s'occuperait du nettoyage et nous faciliterait la vie?
Le CPG n'est pas libre. Lorsque vous remplissez vos caches CPU avec des déchets, ils ne fonctionneront pas aussi bien. Vous pouvez accélérer le code de manière significative en réutilisant des objets. Cela dépend de votre cas d'utilisation quant à savoir lequel est le plus rapide.
Il est difficile de trouver un micro-benchmark décent pour démontrer, mais dans les programmes réels, où le code est plus complexe, l'impact est beaucoup plus élevé que vous pourriez vous attendre.
public class Main {
public static void main(String... args) {
for (int i = 0; i < 10; i++) {
long t1 = timeReuse();
long t2 = timeNewObject();
System.out.printf("Reuse time: %,d, New ArrayList time: %,d%n", t1, t2);
}
}
static final int RUNS = 50000;
static final byte[] a = new byte[8 * 1024];
static final byte[] b = new byte[a.length];
private static long timeReuse() {
long start = System.nanoTime();
List<Integer> ints = new ArrayList<Integer>();
for (int i = 0; i < RUNS; i++) {
ints.clear();
for (int j = -128; j < 128; j++)
ints.add(j);
System.arraycopy(a, 0, b, 0, a.length);
}
long time = System.nanoTime() - start;
return time/RUNS;
}
private static long timeNewObject() {
long start = System.nanoTime();
for (int i = 0; i < RUNS; i++) {
List<Integer> ints = new ArrayList<Integer>(256);
for (int j = -128; j < 128; j++)
ints.add(j);
System.arraycopy(a, 0, b, 0, a.length);
}
long time = System.nanoTime() - start;
return time/RUNS;
}
}
impressions
Reuse time: 1,964, New ArrayList time: 1,866
Reuse time: 1,889, New ArrayList time: 1,770
Reuse time: 1,163, New ArrayList time: 1,416
Reuse time: 1,250, New ArrayList time: 1,357
Reuse time: 1,253, New ArrayList time: 1,393
Reuse time: 1,106, New ArrayList time: 1,203
Reuse time: 1,103, New ArrayList time: 1,207
Reuse time: 1,113, New ArrayList time: 1,315
Reuse time: 1,104, New ArrayList time: 1,215
Reuse time: 1,106, New ArrayList time: 1,335
Note: la taille de la mémoire tampon copié fait une différence.
L'image est bien pire si vous considérez la latence. Cela imprime la pire latence pour chaque exécution.
public class Main {
public static void main(String... args) {
for (int i = 0; i < 10; i++) {
long t1 = timeReuse();
long t2 = timeNewObject();
System.out.printf("Reuse time: %,d, New ArrayList time: %,d%n", t1, t2);
}
}
static final int RUNS = 50000;
static final byte[] a = new byte[8 * 1024];
static final byte[] b = new byte[a.length];
private static long timeReuse() {
List<Integer> ints = new ArrayList<Integer>();
long longest = 0;
for (int i = 0; i < RUNS; i++) {
long start = System.nanoTime();
ints.clear();
for (int j = -128; j < 128; j++)
ints.add(j);
System.arraycopy(a, 0, b, 0, a.length);
long time = System.nanoTime() - start;
longest = Math.max(time, longest);
}
return longest;
}
private static long timeNewObject() {
long longest = 0;
for (int i = 0; i < RUNS; i++) {
long start = System.nanoTime();
List<Integer> ints = new ArrayList<Integer>(256);
for (int j = -128; j < 128; j++)
ints.add(j);
System.arraycopy(a, 0, b, 0, a.length);
long time = System.nanoTime() - start;
longest = Math.max(time, longest);
}
return longest;
}
}
impression Exécuté avec les -Xmx32m
Reuse time: 74,879, New ArrayList time: 2,441,586
Reuse time: 26,889, New ArrayList time: 2,203,096
Reuse time: 25,920, New ArrayList time: 1,514,465
Reuse time: 13,013, New ArrayList time: 1,342,395
Reuse time: 12,368, New ArrayList time: 1,708,658
Reuse time: 12,272, New ArrayList time: 1,258,990
Reuse time: 12,559, New ArrayList time: 1,433,898
Reuse time: 12,144, New ArrayList time: 1,259,413
Reuse time: 12,433, New ArrayList time: 1,221,945
Reuse time: 12,352, New ArrayList time: 1,318,024
Parce que java est passé par la valeur. –
@SotiriosDelimanolis: Façon d'être obtus. Je pense que si vous creusez un peu plus loin, vous trouverez que Java [* passe les références par valeur. *] (Http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass -de-valeur) –
'clear()' fera tout son élément GCAblae, où l'affecter à l'instance 'new' coûtera la création d'un nouvel objet et fera aussi tous les éléments de l'instance réelle de GCable + list GCable –