Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 9783)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 9786)
@@ -33,4 +33,5 @@
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.ForkJoinTask;
@@ -237,4 +238,30 @@
     }
 
+    /**
+     * Saves benchmark data for tests.
+     */
+    public static class BenchmarkData {
+        public long generateTime;
+        public long sortTime;
+        public long drawTime;
+        public Map<Class<? extends StyleElement>, Integer> styleElementCount;
+        public boolean skipDraw;
+
+        private void recordElementStats(List<StyleRecord> srs) {
+            styleElementCount = new HashMap<>();
+            for (StyleRecord r : srs) {
+                Class<? extends StyleElement> klass = r.style.getClass();
+                Integer count = styleElementCount.get(klass);
+                if (count == null) {
+                    count = 0;
+                }
+                styleElementCount.put(klass, count + 1);
+            }
+
+        }
+    }
+    /* can be set by tests, if detailed benchmark data is requested */
+    public BenchmarkData benchmarkData = null;
+
     private static Map<Font, Boolean> IS_GLYPH_VECTOR_DOUBLE_TRANSLATION_BUG = new HashMap<>();
 
@@ -1868,5 +1895,6 @@
         BBox bbox = bounds.toBBox();
         getSettings(renderVirtualNodes);
-        boolean benchmark = Main.isTraceEnabled() || Main.pref.getBoolean("mappaint.render.benchmark", false);
+        boolean benchmarkOutput = Main.isTraceEnabled() || Main.pref.getBoolean("mappaint.render.benchmark", false);
+        boolean benchmark = benchmarkOutput || benchmarkData != null;
 
         data.getReadLock().lock();
@@ -1874,5 +1902,5 @@
             highlightWaySegments = data.getHighlightedWaySegments();
 
-            long timeStart = 0, timePhase1 = 0, timeFinished;
+            long timeStart = 0, timeGenerateDone = 0, timeSortingDone = 0, timeFinished;
             if (benchmark) {
                 timeStart = System.currentTimeMillis();
@@ -1897,9 +1925,23 @@
 
             if (benchmark) {
-                timePhase1 = System.currentTimeMillis();
-                System.err.print("phase 1 (calculate styles): " + Utils.getDurationString(timePhase1 - timeStart));
+                timeGenerateDone = System.currentTimeMillis();
+                if (benchmarkOutput) {
+                    System.err.print("phase 1 (calculate styles): " + Utils.getDurationString(timeGenerateDone - timeStart));
+                }
+                if (benchmarkData != null) {
+                    benchmarkData.generateTime = timeGenerateDone - timeStart;
+                }
             }
 
             Collections.sort(allStyleElems); // TODO: try parallel sort when switching to Java 8
+
+            if (benchmarkData != null) {
+                timeSortingDone = System.currentTimeMillis();
+                benchmarkData.sortTime = timeSortingDone - timeGenerateDone;
+                if (benchmarkData.skipDraw) {
+                    benchmarkData.recordElementStats(allStyleElems);
+                    return;
+                }
+            }
 
             for (StyleRecord r : allStyleElems) {
@@ -1916,7 +1958,13 @@
             if (benchmark) {
                 timeFinished = System.currentTimeMillis();
-                System.err.println("; phase 2 (draw): " + Utils.getDurationString(timeFinished - timePhase1) +
-                    "; total: " + Utils.getDurationString(timeFinished - timeStart) +
-                    " (scale: " + circum + " zoom level: " + Selector.GeneralSelector.scale2level(circum) + ')');
+                if (benchmarkData != null) {
+                    benchmarkData.drawTime = timeFinished - timeGenerateDone;
+                    benchmarkData.recordElementStats(allStyleElems);
+                }
+                if (benchmarkOutput) {
+                    System.err.println("; phase 2 (draw): " + Utils.getDurationString(timeFinished - timeGenerateDone) +
+                        "; total: " + Utils.getDurationString(timeFinished - timeStart) +
+                        " (scale: " + circum + " zoom level: " + Selector.GeneralSelector.scale2level(circum) + ')');
+                }
             }
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSetting.java	(revision 9783)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSetting.java	(revision 9786)
@@ -60,10 +60,5 @@
                 @Override
                 public void actionPerformed(ActionEvent e) {
-                    boolean b = item.isSelected();
-                    if (b == def) {
-                        Main.pref.put(prefKey, null);
-                    } else {
-                        Main.pref.put(prefKey, b);
-                    }
+                    setValue(item.isSelected());
                     Main.worker.submit(new MapPaintStyles.MapPaintStyleLoader(Arrays.asList(parentStyle)));
                 }
@@ -95,4 +90,16 @@
             return Boolean.valueOf(val);
         }
+
+        public void setValue(Object o) {
+            if (o == null || !(o instanceof Boolean)) {
+                throw new IllegalArgumentException();
+            }
+            boolean b = (Boolean) o;
+            if (b == def) {
+                Main.pref.put(prefKey, null);
+            } else {
+                Main.pref.put(prefKey, b);
+            }
+        }
     }
 }
