Tôi đã gặp phải sự cố lạ trong sản xuất hiện nay. Mặc dù tôi yêu ổi, tôi đã gặp phải một trường hợp sử dụng khi số Sets.intersection()
của Guava diễn ra khá tệ. Tôi đã viết một mã mẫu:Hiệu suất không ổn định của Bộ hiệu ứng ổi
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));
Tôi đã cố gắng tạo ra một kịch bản sản xuất tương tự khi tôi có bộ đệm khóa và tôi đang tìm tất cả các khóa có trong bộ nhớ cache. Kỳ lạ thay, tìm kiếm ổi biến mất nhiều thời gian hơn tìm kiếm Java. Sau khi chạy này tôi nhận:
Java search: 0
Guava search: 36
bất cứ ai có thể cho lý do tại sao điều này là không phù hợp đối với trường hợp sử dụng của tôi hoặc là có một lỗi trong ổi?
vui lòng xem http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java –
Có, việc triển khai Ổi thực hiện không đối xứng: nếu tập đầu tiên lớn hơn rất nhiều so với tập thứ hai, nó sẽ chậm hơn rất nhiều. Thử chuyển đổi hai bộ. – biziclop
Có, tập đầu tiên của tôi đã nhỏ hơn nhiều. – Heisenberg