Bir kümem var - HashSet Bazı öğeleri kaldırmak istiyorum… "kaldırmalar" koleksiyonundaki öğelerin hiçbiri orijinal ayarında olmayacak.HashSet removeAll yöntemi şaşırtıcı derecede yavaş
"Kaynak" kümesinin boyutunu ve komut satırındaki "taşınma" koleksiyonunun boyutunu ve her ikisini de yapıyorum. Kaynak küme yalnızca negatif olmayan tamsayılar içerir; kaldırma kümeleri yalnızca negatif tamsayılar içerir. Dünyanın en doğru kronometresi olmayan System.currentTimeMillis() öğesini kullanarak tüm öğeleri kaldırmak ne kadar sürdüğünü ölçüyorum, ancak göreceğiniz gibi bu durumda yeterli değil. İşte 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");
}
}
hadi kolay bir iş vererek başlayayım: kaynağı 100 maddeden seti ve 100 kaldırmak için:
c:UsersJonTest>java Test 100 100
Time taken: 1ms
Tamam, beklendiği gibi bu hızlı.
Daha sonra bir milyon öğenin ve 300.000 öğenin kaldırılmasını denedim?
c:UsersJonTest>java Test 1000000 300000
Time taken: 38ms
Bu hala oldukça hızlı görünüyor.
c:UsersJonTest>java Test 300000 300000
Time taken: 178131ms
Yaklaşık üç dakika: 300.000 kaynak öğeleri ve 300.000 removals - Şimdi daha kolay biraz yapmak?
Gerçekten kafam karıştı! Birisi bunun neden olduğunu açıklayabilir.
hatalı test olabilir: - (işaretli değil diğer sürümleri Java 8'de) Referans için
, bu
removeAll
ait kodudur. PC'niz yüklenebilir, yeterli RAM'ınız olmayabilir, uygun bir şekilde ayrılmış tahsis edilmemiş ve daha pek çok şey olabilir. – SMAHayır, Test durumu gayet farklı makinelerde koştuğunuzda makinenizde de çalıştırabilirsiniz. –
Kodunuzu test ettim ve hızlı çalıştı. Senin için, bitirmek için ~ 12ms aldı. Ayrıca her iki girdi değerini de 10 arttırıyorum ve 36ms aldı. Testleri yaparken PC'niz bazı yoğun CPU görevlerini yapabilir mi? – Slimu