Ho riscontrato uno strano problema nella produzione di oggi. Anche se adoro Guava, mi sono imbattuto in un caso d'uso in cui lo Sets.intersection()
di Guava si comportava male. Ho scritto un codice di esempio:Guava Sets.intersection prestazione errata
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));
Ho cercato di creare un simile scenario di produzione dove ho una cache chiavi, e sto cercando tutte le chiavi presenti nella cache. Stranamente, la ricerca di Guava richiede molto più tempo della ricerca Java. Dopo aver eseguito questo ho ottenuto:
Java search: 0
Guava search: 36
Chiunque può dire il motivo per cui questo non è adatto per il mio caso d'uso o c'è un bug nel Guava?
si prega di dare un'occhiata a http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java –
Sì, l'implementazione di Guava sembra essere asimmetrica: se il primo set è molto più grande del secondo, è molto più lento. Prova a cambiare i due set. – biziclop
Sì, il mio primo set è già molto più piccolo. – Heisenberg