import java.util.*; public class BenchmarkQuick { public static void main(String[] args) { int[] sizes = {20, 50, 100, 200, 500}; int P = 64; System.out.println("S\tVector(ms)\tHashSet(ms)\tRatio"); for (int S : sizes) { long baseAddr = 0x10000000L; List> allPages = new ArrayList<>(); for (int i = 0; i < S; i++) { List pages = new ArrayList<>(); for (int p = 0; p < P; p++) pages.add(baseAddr + p); allPages.add(pages); } // Defective long d = 0; for (int r = 0; r < 15; r++) { Map> vec = new HashMap<>(); for (int i = 0; i < S; i++) for (long pg : allPages.get(i)) vec.computeIfAbsent(pg, k->new ArrayList<>()).add(i); long t = System.nanoTime(); for (int i = 0; i < S; i++) for (long pg : allPages.get(i)) { List s = vec.get(pg); s.remove(Integer.valueOf(i)); } if (r >= 5) d += System.nanoTime() - t; } // Fixed long f = 0; for (int r = 0; r < 15; r++) { Map> set = new HashMap<>(); for (int i = 0; i < S; i++) for (long pg : allPages.get(i)) set.computeIfAbsent(pg, k->new HashSet<>()).add(i); long t = System.nanoTime(); for (int i = 0; i < S; i++) for (long pg : allPages.get(i)) { Set s = set.get(pg); s.remove(i); } if (r >= 5) f += System.nanoTime() - t; } System.out.printf("%d\t%.3f\t\t%.3f\t\t%.1f%n", S, d/10.0/1e6, f/10.0/1e6, (double)d/f); } } }