package unit; import java.util.*; import java.util.stream.*; /** * onos-0004: ConnectivityIntentCompiler resourcesAllocated List.contains O(R×C) → O(C) with Set * SLOW: List.contains() — O(R) per element in filter stream * FAST: HashSet.contains() — O(1) per element */ public class ONOS0004ConnectivityResourcesTest { static long cmpOps = 0; // Simulate Resource (integer id) static class Resource { final int id; Resource(int id) { this.id = id; } @Override public boolean equals(Object o) { cmpOps++; return o instanceof Resource && ((Resource)o).id == id; } @Override public int hashCode() { return id; } } // SLOW: List.contains() inside filter — O(R) per candidate static List filterSlow(List candidates, List allocated) { return candidates.stream() .filter(r -> !allocated.contains(r)) // O(R) per candidate .collect(Collectors.toList()); } // FAST: HashSet.contains() — O(1) per candidate static List filterFast(List candidates, List allocated) { Set allocatedSet = new HashSet<>(allocated); return candidates.stream() .filter(r -> !allocatedSet.contains(r)) .collect(Collectors.toList()); } public static void main(String[] args) { int R = 100; // already-allocated resources int C = 50; // incoming candidates int CALLS = 500; // intent recompile events // Build test data: allocated resources 0..R-1, candidates 50..50+C-1 (overlap at 50..99) List allocated = IntStream.range(0, R) .mapToObj(Resource::new).collect(Collectors.toList()); List candidates = IntStream.range(C, C + C) .mapToObj(Resource::new).collect(Collectors.toList()); // Verify correctness List slowResult = filterSlow(candidates, allocated); cmpOps = 0; List fastResult = filterFast(candidates, allocated); if (slowResult.size() != fastResult.size()) { System.err.println("FAIL: slow=" + slowResult.size() + " fast=" + fastResult.size()); System.exit(1); } // Benchmark SLOW cmpOps = 0; for (int i = 0; i < CALLS; i++) filterSlow(candidates, allocated); long slowCmp = cmpOps; // Benchmark FAST (count HashSet lookups as C per call) long fastOps = (long) CALLS * C; double ratio = (double) slowCmp / Math.max(fastOps, 1); System.out.printf("onos-0004 ConnectivityResources: SLOW=%d cmpOps, FAST~=%d ops, ratio=%.1fx%n", slowCmp, fastOps, ratio); if (ratio < 5.0) { System.err.println("FAIL: ratio " + ratio + " < 5x"); System.exit(1); } System.out.println("PASS"); } }