Refactor PerformanceMonitor
* Enable multiple experiment to run in parallel.
* Map to store PerformanceMonitor per experiment
Change-Id: Ib1c2556854ccee5ae4f84575a55e5c153f6718d8
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
index 3721ceb..15e5cdc 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
@@ -12,10 +12,26 @@
* Class for collecting performance measurements
*/
public class PerformanceMonitor {
- private final static ConcurrentHashMap<String, Queue<Measurement>> map = new ConcurrentHashMap<>();;
private final static Logger log = LoggerFactory.getLogger(PerformanceMonitor.class);
- private static long overhead;
- private static long experimentStart = Long.MAX_VALUE;
+
+ // experiment name -> PerformanceMonitor
+ private static final ConcurrentHashMap<String,PerformanceMonitor> perfMons = new ConcurrentHashMap<>();
+ public static PerformanceMonitor experiment(String name) {
+ PerformanceMonitor pm = perfMons.get(name);
+ if (pm == null) {
+ pm = new PerformanceMonitor();
+ PerformanceMonitor existing = perfMons.putIfAbsent(name, pm);
+ if (existing != null) {
+ pm = existing;
+ }
+ }
+ return pm;
+ }
+
+ // tag -> Measurements
+ private final ConcurrentHashMap<String, Queue<Measurement>> map = new ConcurrentHashMap<>();
+ private long overhead;
+ private long experimentStart = Long.MAX_VALUE;
private final static double normalization = Math.pow(10, 6);
/**
@@ -26,7 +42,7 @@
*
* @param tag for performance measurement
*/
- public static Measurement start(String tag) {
+ public Measurement startStep(String tag) {
long start = System.nanoTime();
if(start < experimentStart) {
experimentStart = start;
@@ -54,7 +70,7 @@
*
* @param tag for performance measurement
*/
- public static void stop(String tag) {
+ public void stopStep(String tag) {
long time = System.nanoTime();
Queue<Measurement> list = map.get(tag);
if(list == null || list.size() == 0) {
@@ -70,7 +86,7 @@
/**
* Clear all performance measurements.
*/
- public static void clear() {
+ public void reset() {
map.clear();
overhead = 0;
experimentStart = Long.MAX_VALUE;
@@ -79,7 +95,7 @@
/**
* Write all performance measurements to the log
*/
- public static void report() {
+ public void reportAll() {
String result = "Performance Results: (avg/start/stop/count)\n";
if(map.size() == 0) {
result += "No Measurements";
@@ -132,7 +148,7 @@
*
* @param tag the tag name.
*/
- public static void report(String tag) {
+ public void reportStep(String tag) {
Queue<Measurement> list = map.get(tag);
if(list == null) {
return; //TODO
@@ -208,6 +224,34 @@
}
}
+ @Deprecated
+ private static final PerformanceMonitor theInstance = new PerformanceMonitor();
+
+ @Deprecated
+ public static Measurement start(String tag) {
+ return theInstance.startStep(tag);
+ }
+
+ @Deprecated
+ public static void stop(String tag) {
+ theInstance.stopStep(tag);;
+ }
+
+ @Deprecated
+ public static void clear() {
+ theInstance.reset();;
+ }
+
+ @Deprecated
+ public static void report() {
+ theInstance.reportAll();;
+ }
+
+ @Deprecated
+ public static void report(String tag) {
+ theInstance.reportStep(tag);
+ }
+
public static void main(String args[]){
// test the measurement overhead
String tag;