Mam zestaw - HashSet Chcę usunąć niektóre elementy z niego ... żaden z elementów w kolekcji "usunięcia" nie będzie w oryginalnym zestawie.HashSet removeAll metoda jest zadziwiająco powolna
Określaję rozmiar zestawu "źródłowego" i wielkość kolekcji "usuwania" w wierszu poleceń i buduję oba. Zbiór źródłowy zawiera tylko nieujemne liczby całkowite; zestaw usunięć zawiera tylko ujemne liczby całkowite. Zmierzam, ile czasu potrzeba na usunięcie wszystkich elementów za pomocą System.currentTimeMillis(), który nie jest najdokładniejszym stoperem na świecie, ale w tym przypadku jest więcej niż wystarczający, jak zobaczysz. Oto kod:
import java.util.*;
public class Test
{
public static void main(String[] args)
{
int sourceSize = Integer.parseInt(args[0]);
int removalsSize = Integer.parseInt(args[1]);
Set<Integer> source = new HashSet<Integer>();
Collection<Integer> removals = new ArrayList<Integer>();
for (int i = 0; i < sourceSize; i++)
{
source.add(i);
}
for (int i = 1; i <= removalsSize; i++)
{
removals.add(-i);
}
long start = System.currentTimeMillis();
source.removeAll(removals);
long end = System.currentTimeMillis();
System.out.println("Time taken: " + (end – start) + "ms");
}
}
Zacznijmy poprzez nadanie mu to łatwa praca: zestaw źródłem 100 sztuk i 100 w celu usunięcia:
c:UsersJonTest>java Test 100 100
Time taken: 1ms
Dobra, to szybko, jak się spodziewałem.
Następnie wypróbowałem źródło miliona przedmiotów i 300 000 przedmiotów do usunięcia?
c:UsersJonTest>java Test 1000000 300000
Time taken: 38ms
To wciąż wydaje się dość szybkie. Teraz sprawiają, że nieco łatwiej - 300,000 pozycji źródłowych oraz 300.000 przeprowadzki:
c:UsersJonTest>java Test 300000 300000
Time taken: 178131ms
Prawie trzy minuty?
Naprawdę zdezorientowany !! Czy ktoś może wyjaśnić, dlaczego tak się dzieje?
może być uszkodzony testowania. Twój komputer może być załadowany, możesz mieć za mało pamięci RAM, nie masz przydzielonej odpowiedniej sterty i wiele więcej. – SMA
Nie, sprawa testowa jest w porządku, uruchomiona na innej maszynie, możesz uruchomić ją również na swoim komputerze. –
Przetestowałem twój kod i działało szybko. Dla ciebie sprawa zajęła ~ 12ms. Zwiększyłem również obie wartości wejściowe o 10 i zajęło to 36 ms. Może twój PC wykonuje jakieś intensywne zadania CPU podczas uruchamiania testów? – Slimu