java-topology/defects/onos/unit/ONOS0004ConnectivityResourcesTest.java

79 lines
2.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package unit;
import java.util.*;
import java.util.stream.*;
/**
* onos-0004: ConnectivityIntentCompiler resourcesAllocated List.contains O(R×C) → O(C) with Set
* SLOW: List<Resource>.contains() — O(R) per element in filter stream
* FAST: HashSet<Resource>.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<Resource> filterSlow(List<Resource> candidates, List<Resource> 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<Resource> filterFast(List<Resource> candidates, List<Resource> allocated) {
Set<Resource> 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<Resource> allocated = IntStream.range(0, R)
.mapToObj(Resource::new).collect(Collectors.toList());
List<Resource> candidates = IntStream.range(C, C + C)
.mapToObj(Resource::new).collect(Collectors.toList());
// Verify correctness
List<Resource> slowResult = filterSlow(candidates, allocated);
cmpOps = 0;
List<Resource> 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");
}
}