Napotkany dziś dziwny problem w produkcji. Chociaż kocham Guava, natknąłem się na przypadek użycia, w którym Guva Sets.intersection()
radził sobie całkiem nieźle. Pisałem przykładowy kod:Guava SetsInsesection Bad Performance
Set<Long> cache = new HashSet<>();
for (long i = 0; i < 1000000; i++) {
cache.add(i);
}
Set<Long> keys = new HashSet<>();
for (long i = 0; i < 100; i++) {
keys.add(i);
}
long start = System.currentTimeMillis();
Set<Long> foundKeys = new HashSet<>();
for (Long key : keys) {
if (cache.contains(key)) {
foundKeys.add(key);
}
}
System.out.println("Java search: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
SetView<Long> intersection = Sets.intersection(keys, cache);
System.out.println("Guava search: " + (System.currentTimeMillis() - start));
Starałem się stworzyć podobny scenariusz produkcyjną gdzie byłem cache klucze i szukam wszystkich przycisków znajdujących się w pamięci podręcznej. O dziwo, wyszukiwanie w Guava trwa znacznie dłużej niż wyszukiwanie w języku Java. Po uruchomieniu tego otrzymałem:
Java search: 0
Guava search: 36
Czy ktoś może powiedzieć, dlaczego nie jest to odpowiednie dla mojego przypadku użycia lub czy jest jakiś błąd w Guava?
proszę spojrzeć na http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java –
Tak, implementacja Guava jest asymetryczna: jeśli pierwszy zestaw jest dużo większy niż drugi, jest znacznie wolniejszy. Spróbuj przełączyć dwa zestawy. – biziclop
Tak, mój pierwszy zestaw jest już znacznie mniejszy. – Heisenberg