У меня возникла странная проблема в производстве сегодня. Хотя я люблю Гуаву, я столкнулся с прецедентом, в котором Sets.intersection()
Guava играл довольно плохо. Я написал пример кода:Guava Sets.intersection плохая производительность
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));
Я пытался создать подобный производственный сценарий, в котором я кэш ключей, и я ищу для всех ключей в кэше. Странно, поиск Гува занимает гораздо больше времени, чем поиск в Java. После выполнения этого я получил:
Java search: 0
Guava search: 36
Может кто-нибудь сказать, почему это не подходит для моего случая использования или есть ошибка в гуавы?
см. Http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java –
Да, реализация Guava оказывается асимметричной: если первый набор намного больше второго, он намного медленнее. Попробуйте переключить два набора. – biziclop
Да, мой первый набор уже намного меньше. – Heisenberg