|
6 | 6 | import java.io.PrintWriter; |
7 | 7 | import java.text.NumberFormat; |
8 | 8 | import java.util.Date; |
| 9 | +import java.util.List; |
9 | 10 | import java.util.Map; |
| 11 | +import java.util.Map.Entry; |
10 | 12 |
|
11 | 13 | import com.tagtraum.perf.gcviewer.exp.AbstractDataWriter; |
| 14 | +import com.tagtraum.perf.gcviewer.math.DoubleData; |
| 15 | +import com.tagtraum.perf.gcviewer.math.DoubleDataPercentile; |
12 | 16 | import com.tagtraum.perf.gcviewer.model.GCModel; |
13 | 17 | import com.tagtraum.perf.gcviewer.util.FormattedValue; |
14 | 18 | import com.tagtraum.perf.gcviewer.util.MemoryFormat; |
@@ -69,7 +73,7 @@ public SummaryDataWriter(OutputStream out, Map<String, Object> configuration) { |
69 | 73 |
|
70 | 74 | private void initialiseFormatters() { |
71 | 75 | pauseFormatter = NumberFormat.getInstance(); |
72 | | - pauseFormatter.setMaximumFractionDigits(5); |
| 76 | + pauseFormatter.setMaximumFractionDigits(6); |
73 | 77 |
|
74 | 78 | totalTimeFormatter = new TimeFormat(); |
75 | 79 |
|
@@ -227,6 +231,74 @@ private void exportPauseSummary(PrintWriter out, GCModel model) { |
227 | 231 | exportValue(out, "fullGCPausePc", percentFormatter.format(model.getFullGCPause().getSum()*100.0/model.getPause().getSum()), "%"); |
228 | 232 | exportValue(out, "gcPause", gcTimeFormatter.format(model.getGCPause().getSum()), "s"); |
229 | 233 | exportValue(out, "gcPausePc", percentFormatter.format(model.getGCPause().getSum()*100.0/model.getPause().getSum()), "%"); |
| 234 | + |
| 235 | + // Add extra statistical data: sum, count, min, max, average, standardDeviation, median, 75th percentile, 95, 99, 99.5, 99.9 |
| 236 | + // All Pause stats |
| 237 | + if (pauseDataAvailable) { |
| 238 | + exportValue(out, "pauseSum", pauseFormatter.format(model.getPause().getSum()), "s"); |
| 239 | + // exportValue(out, "pauseCount", "" + model.getPause().getN(), "-"); |
| 240 | + exportValue(out, "pauseMin", pauseFormatter.format(model.getPause().getMin()), "s"); |
| 241 | + exportValue(out, "pauseMax", pauseFormatter.format(model.getPause().getMax()), "s"); |
| 242 | + exportValue(out, "pauseAverage", pauseFormatter.format(model.getPause().average()), "s"); |
| 243 | + exportValue(out, "pauseStandardDeviation", pauseFormatter.format(model.getPause().standardDeviation()), "s"); |
| 244 | + exportValue(out, "pauseMedian", pauseFormatter.format(((DoubleDataPercentile)model.getPause()).getPercentile(50)), "s"); |
| 245 | + exportValue(out, "pausePercentile75th", pauseFormatter.format(((DoubleDataPercentile)model.getPause()).getPercentile(50)), "s"); |
| 246 | + exportValue(out, "pausePercentile95th", pauseFormatter.format(((DoubleDataPercentile)model.getPause()).getPercentile(75)), "s"); |
| 247 | + exportValue(out, "pausePercentile99th", pauseFormatter.format(((DoubleDataPercentile)model.getPause()).getPercentile(95)), "s"); |
| 248 | + exportValue(out, "pausePercentile99.5th", pauseFormatter.format(((DoubleDataPercentile)model.getPause()).getPercentile(99)), "s"); |
| 249 | + exportValue(out, "pausePercentile99.9th", pauseFormatter.format(((DoubleDataPercentile)model.getPause()).getPercentile(99.9)), "s"); |
| 250 | + } |
| 251 | + // GC Pause stats |
| 252 | + if (gcDataAvailable) { |
| 253 | + exportValue(out, "gcPauseSum", pauseFormatter.format(model.getGCPause().getSum()), "s"); |
| 254 | + // exportValue(out, "gcPauseCount", "" + model.getGCPause().getN(), "-"); |
| 255 | + exportValue(out, "gcPauseMin", pauseFormatter.format(model.getGCPause().getMin()), "s"); |
| 256 | + exportValue(out, "gcPauseMax", pauseFormatter.format(model.getGCPause().getMax()), "s"); |
| 257 | + exportValue(out, "gcPauseAverage", pauseFormatter.format(model.getGCPause().average()), "s"); |
| 258 | + exportValue(out, "gcPauseStandardDeviation", pauseFormatter.format(model.getGCPause().standardDeviation()), "s"); |
| 259 | + exportValue(out, "gcPauseMedian", pauseFormatter.format(((DoubleDataPercentile)model.getGCPause()).getPercentile(50)), "s"); |
| 260 | + exportValue(out, "gcPausePercentile75th", pauseFormatter.format(((DoubleDataPercentile)model.getGCPause()).getPercentile(50)), "s"); |
| 261 | + exportValue(out, "gcPausePercentile95th", pauseFormatter.format(((DoubleDataPercentile)model.getGCPause()).getPercentile(75)), "s"); |
| 262 | + exportValue(out, "gcPausePercentile99th", pauseFormatter.format(((DoubleDataPercentile)model.getGCPause()).getPercentile(95)), "s"); |
| 263 | + exportValue(out, "gcPausePercentile99.5th", pauseFormatter.format(((DoubleDataPercentile)model.getGCPause()).getPercentile(99)), "s"); |
| 264 | + exportValue(out, "gcPausePercentile99.9th", pauseFormatter.format(((DoubleDataPercentile)model.getGCPause()).getPercentile(99.9)), "s"); |
| 265 | + } |
| 266 | + // Full GC Pause stats |
| 267 | + if (fullGCDataAvailable) { |
| 268 | + exportValue(out, "fullGCPauseSum", pauseFormatter.format(model.getFullGCPause().getSum()), "s"); |
| 269 | + // exportValue(out, "fullGCPauseCount", "" + model.getFullGCPause().getN(), "-"); |
| 270 | + exportValue(out, "fullGCPauseMin", pauseFormatter.format(model.getFullGCPause().getMin()), "s"); |
| 271 | + exportValue(out, "fullGCPauseMax", pauseFormatter.format(model.getFullGCPause().getMax()), "s"); |
| 272 | + exportValue(out, "fullGCPauseAverage", pauseFormatter.format(model.getFullGCPause().average()), "s"); |
| 273 | + exportValue(out, "fullGCPauseStandardDeviation", pauseFormatter.format(model.getFullGCPause().standardDeviation()), "s"); |
| 274 | + exportValue(out, "fullGCPauseMedian", pauseFormatter.format(((DoubleDataPercentile)model.getFullGCPause()).getPercentile(50)), "s"); |
| 275 | + exportValue(out, "fullGCPausePercentile75th", pauseFormatter.format(((DoubleDataPercentile)model.getFullGCPause()).getPercentile(50)), "s"); |
| 276 | + exportValue(out, "fullGCPausePercentile95th", pauseFormatter.format(((DoubleDataPercentile)model.getFullGCPause()).getPercentile(75)), "s"); |
| 277 | + exportValue(out, "fullGCPausePercentile99th", pauseFormatter.format(((DoubleDataPercentile)model.getFullGCPause()).getPercentile(95)), "s"); |
| 278 | + exportValue(out, "fullGCPausePercentile99.5th", pauseFormatter.format(((DoubleDataPercentile)model.getFullGCPause()).getPercentile(99)), "s"); |
| 279 | + exportValue(out, "fullGCPausePercentile99.9th", pauseFormatter.format(((DoubleDataPercentile)model.getFullGCPause()).getPercentile(99.9)), "s"); |
| 280 | + } |
| 281 | + // ZGC stats: [gc,phases] |
| 282 | + if (model.size() > 1 && model.getGcEventPhases().size() > 0) { |
| 283 | + DoubleData gcPhases = new DoubleDataPercentile(); |
| 284 | + for (Entry<String, DoubleData> entry : model.getGcEventPhases().entrySet()) { |
| 285 | + List<Double> phaseList = ((DoubleDataPercentile)entry.getValue()).getDoubleData(); |
| 286 | + for (Double d : phaseList) |
| 287 | + gcPhases.add(d); |
| 288 | + } |
| 289 | + exportValue(out, "gcPhaseSum", pauseFormatter.format(gcPhases.getSum()), "s"); |
| 290 | + exportValue(out, "gcPhaseCount", "" + gcPhases.getN(), "-"); |
| 291 | + exportValue(out, "gcPhaseMin", pauseFormatter.format(gcPhases.getMin()), "s"); |
| 292 | + exportValue(out, "gcPhaseMax", pauseFormatter.format(gcPhases.getMax()), "s"); |
| 293 | + exportValue(out, "gcPhaseAverage", pauseFormatter.format(gcPhases.average()), "s"); |
| 294 | + exportValue(out, "gcPhaseStandardDeviation", pauseFormatter.format(gcPhases.standardDeviation()), "s"); |
| 295 | + exportValue(out, "gcPhaseMedian", pauseFormatter.format(((DoubleDataPercentile)gcPhases).getPercentile(50)), "s"); |
| 296 | + exportValue(out, "gcPhasePercentile75th", pauseFormatter.format(((DoubleDataPercentile)gcPhases).getPercentile(50)), "s"); |
| 297 | + exportValue(out, "gcPhasePercentile95th", pauseFormatter.format(((DoubleDataPercentile)gcPhases).getPercentile(75)), "s"); |
| 298 | + exportValue(out, "gcPhasePercentile99th", pauseFormatter.format(((DoubleDataPercentile)gcPhases).getPercentile(95)), "s"); |
| 299 | + exportValue(out, "gcPhasePercentile99.5th", pauseFormatter.format(((DoubleDataPercentile)gcPhases).getPercentile(99)), "s"); |
| 300 | + exportValue(out, "gcPhasePercentile99.9th", pauseFormatter.format(((DoubleDataPercentile)gcPhases).getPercentile(99.9)), "s"); |
| 301 | + } |
230 | 302 | } |
231 | 303 |
|
232 | 304 | private boolean isSignificant(final double average, final double standardDeviation) { |
|
0 commit comments