diff --git a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java index b03499f247b57abf288558954e4a328b53bb2715..6e2ed0be5a4dcf241e913637e0f9c48e9593af8f 100644 --- a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java +++ b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java @@ -38,12 +38,40 @@ public class OneMeasurementHistogram extends OneMeasurement public static final String BUCKETS="histogram.buckets"; public static final String BUCKETS_DEFAULT="1000"; + + /** + * Specify the range of latencies to track in the histogram. + */ int _buckets; + + /** + * Groups operations in discrete blocks of 1ms width. + */ int[] histogram; + + /** + * Counts all operations outside the histogram's range. + */ int histogramoverflow; + + /** + * The total number of reported operations. + */ int operations; + + /** + * The sum of each latency measurement over all operations. + * Calculated in ms. + */ long totallatency; + /** + * The sum of each latency measurement squared over all operations. + * Used to calculate variance of latency. + * Calculated in ms. + */ + double totalsquaredlatency; + //keep a windowed version of these stats for printing status int windowoperations; long windowtotallatency; @@ -59,6 +87,7 @@ public class OneMeasurementHistogram extends OneMeasurement histogramoverflow=0; operations=0; totallatency=0; + totalsquaredlatency=0; windowoperations=0; windowtotallatency=0; min=-1; @@ -70,6 +99,7 @@ public class OneMeasurementHistogram extends OneMeasurement */ public synchronized void measure(int latency) { + //latency reported in us and collected in bucket by ms. if (latency/1000>=_buckets) { histogramoverflow++; @@ -79,9 +109,10 @@ public class OneMeasurementHistogram extends OneMeasurement histogram[latency/1000]++; } operations++; - totallatency+=latency; + totallatency += latency; + totalsquaredlatency += ((double)latency) * ((double)latency); windowoperations++; - windowtotallatency+=latency; + windowtotallatency += latency; if ( (min<0) || (latency<min) ) { @@ -97,8 +128,11 @@ public class OneMeasurementHistogram extends OneMeasurement @Override public void exportMeasurements(MeasurementsExporter exporter) throws IOException { + double mean = totallatency/((double)operations); + double variance = totalsquaredlatency/((double)operations) - (mean * mean); exporter.write(getName(), "Operations", operations); - exporter.write(getName(), "AverageLatency(us)", (((double)totallatency)/((double)operations))); + exporter.write(getName(), "AverageLatency(us)", mean); + exporter.write(getName(), "LatencyVariance(us)", variance); exporter.write(getName(), "MinLatency(us)", min); exporter.write(getName(), "MaxLatency(us)", max); diff --git a/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java b/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java index 1d852bb6a23cbffdfb9128a74a9ec9b16701b083..1d24f9ae34f73ada9dbe72ff036335d475e367fa 100644 --- a/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java +++ b/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java @@ -52,7 +52,7 @@ public class TestMeasurementsExporter { JsonNode json = mapper.readTree(out.toString("UTF-8")); assertTrue(json.isArray()); assertEquals(json.get(0).get("measurement").asText(), "Operations"); - assertEquals(json.get(3).get("measurement").asText(), "MaxLatency(us)"); - assertEquals(json.get(11).get("measurement").asText(), "5"); + assertEquals(json.get(4).get("measurement").asText(), "MaxLatency(us)"); + assertEquals(json.get(11).get("measurement").asText(), "4"); } }