From 4cf840b32a8979c27e12775cc7865f8e1318d0a9 Mon Sep 17 00:00:00 2001 From: bancika Date: Mon, 6 Apr 2020 11:40:18 +0200 Subject: [PATCH] log render time stats periodically --- .../org/diylc/presenter/DrawingManager.java | 34 +++++++++++++++++++ .../diylc-core/src/org/diylc/utils/Pair.java | 8 +++++ 2 files changed, 42 insertions(+) diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java index 636814f6..d6fe454e 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java @@ -40,6 +40,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.ConfigurationManager; @@ -57,6 +58,7 @@ import org.diylc.core.Project; import org.diylc.core.Theme; import org.diylc.core.VisibilityPolicy; import org.diylc.utils.Constants; +import org.diylc.utils.Pair; /** * Utility that deals with painting {@link Project} on the {@link Graphics2D} and keeps areas taken @@ -105,6 +107,11 @@ public class DrawingManager { private boolean debugComponentAreas; private boolean debugContinuityAreas; + + // rendering stats + private Map> renderStatsByType = new HashMap>(); + private long lastStatsReportedTime = System.currentTimeMillis(); + private long statReportFrequencyMs = 1000 * 60; public DrawingManager(MessageDispatcher messageDispatcher) { super(); @@ -277,6 +284,7 @@ public class DrawingManager { g2d.setComposite(lockedComposite); } // Draw the component through the g2dWrapper. + long componentStart = System.nanoTime(); try { if (drawOptions.contains(DrawOption.ENABLE_CACHING)) // go through the DrawingCache @@ -294,6 +302,32 @@ public class DrawingManager { } catch (Exception e) { LOG.error("Error drawing " + component.getName(), e); failedComponents.add(component); + } finally { + // record render stats + long componentEnd = System.nanoTime(); + Pair stats = null; + String key = component.getClass().getCanonicalName(); + if (renderStatsByType.containsKey(key)) { + stats = renderStatsByType.get(key); + stats.setFirst(stats.getFirst() + 1); + stats.setSecond(stats.getSecond() + (componentEnd - componentStart)); + } else { + stats = new Pair(1, componentEnd - componentStart); + renderStatsByType.put(key, stats); + } + + // log render time stats periodically + if (System.currentTimeMillis() - lastStatsReportedTime > statReportFrequencyMs) { + lastStatsReportedTime = System.currentTimeMillis(); + String mapAsString = renderStatsByType.keySet().stream() + .map(k -> { + Pair s = renderStatsByType.get(k); + return k + "=" + s.getFirst() + "x " + + TimeUnit.MILLISECONDS.convert(s.getSecond(), TimeUnit.NANOSECONDS) + "ms "; + }) + .collect(Collectors.joining(", ", "{", "}")); + LOG.debug("Render stats: " + mapAsString); + } } ComponentArea area = g2dWrapper.finishedDrawingComponent(); if (trackArea && area != null && !area.getOutlineArea().isEmpty()) { diff --git a/diylc/diylc-core/src/org/diylc/utils/Pair.java b/diylc/diylc-core/src/org/diylc/utils/Pair.java index 3360ba7e..751720c7 100644 --- a/diylc/diylc-core/src/org/diylc/utils/Pair.java +++ b/diylc/diylc-core/src/org/diylc/utils/Pair.java @@ -38,5 +38,13 @@ public class Pair { public B getSecond() { return second; + } + + public void setFirst(A first) { + this.first = first; + } + + public void setSecond(B second) { + this.second = second; } }