Donc à l'origine, j'avais ce code:
import java.util.*;
public class sandbox {
public static void main(String[] args) {
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < 100_000; i++) {
hashSet.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 100_000; i++) {
for (Integer val : hashSet) {
if (val != -1) break;
}
hashSet.remove(i);
}
System.out.println("time: " + (System.currentTimeMillis() - start));
}
}
Il faut environ 4 secondes pour exécuter les boucles imbriquées sur mon ordinateur et je ne comprends pas pourquoi cela a pris autant de temps. La boucle externe s'exécute 100 000 fois, la boucle for interne doit s'exécuter 1 fois (car toute valeur de hashSet ne sera jamais -1) et la suppression d'un élément d'un HashSet est O (1), il devrait donc y avoir environ 200 000 opérations. S'il y a généralement 100 000 000 d'opérations en une seconde, comment se fait-il que mon code prenne 4 secondes pour s'exécuter?
De plus, si la ligne hashSet.remove(i);
est mise en commentaire, le code ne prend que 16 ms. Si la boucle for interne est commentée (mais pas hashSet.remove(i);
), le code ne prend que 8 ms.
for val
boucle est la chose qui prend le temps. C'est remove
encore très rapide. Une sorte de surcharge configurant un nouvel itérateur après la modification de l'ensemble ...?
for val
boucle est lente. Cependant, notez que la boucle n'est pas nécessaire du tout. Si vous souhaitez vérifier s'il existe des valeurs différentes de -1 dans l'ensemble, il serait beaucoup plus efficace de vérifier hashSet.size() > 1 || !hashSet.contains(-1)
.