Więc pierwotnie miałem ten kod:
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));
}
}
Uruchomienie zagnieżdżonych pętli na moim komputerze zajmuje około 4 sekund i nie rozumiem, dlaczego trwało to tak długo. Pętla zewnętrzna działa 100 000 razy, wewnętrzna pętla for powinna działać 1 raz (ponieważ każda wartość hashSet nigdy nie będzie wynosić -1), a usunięcie elementu z HashSet to O (1), więc powinno być około 200 000 operacji. Jeśli na sekundę wykonuje się zwykle 100 000 000 operacji, dlaczego mój kod zajmuje 4 sekundy?
Dodatkowo, jeśli linia hashSet.remove(i);
jest skomentowana, kod zajmuje tylko 16ms. Jeśli wewnętrzna pętla for jest skomentowana (ale nie hashSet.remove(i);
), kod zajmuje tylko 8ms.
for val
to, że zajęcie czasu zajmuje pętla. remove
Jest wciąż bardzo szybko. Jakiś narzut związany z konfiguracją nowego iteratora po modyfikacji zestawu ...?
for val
pętla jest wolna. Pamiętaj jednak, że pętla wcale nie jest potrzebna. Jeśli chcesz sprawdzić, czy w zestawie są jakieś wartości inne niż -1, sprawdzenie byłoby znacznie wydajniejsze hashSet.size() > 1 || !hashSet.contains(-1)
.