diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/RenderBenchmarkCollector.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/RenderBenchmarkCollector.java
index 79002ea5b..dc23b7634 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/RenderBenchmarkCollector.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/RenderBenchmarkCollector.java
@@ -64,19 +64,19 @@ public class RenderBenchmarkCollector {
 
         @Override
         public void renderStart(double circum) {
-            timeStart = System.currentTimeMillis();
+            timeStart = getCurrentTimeMilliseconds();
             super.renderStart(circum);
         }
 
         @Override
         public boolean renderSort() {
-            timeGenerateDone = System.currentTimeMillis();
+            timeGenerateDone = getCurrentTimeMilliseconds();
             return super.renderSort();
         }
 
         @Override
         public boolean renderDraw(List<StyleRecord> allStyleElems) {
-            timeSortingDone = System.currentTimeMillis();
+            timeSortingDone = getCurrentTimeMilliseconds();
             return super.renderDraw(allStyleElems);
         }
 
@@ -98,7 +98,7 @@ public class RenderBenchmarkCollector {
 
         @Override
         public void renderDone() {
-            timeFinished = System.currentTimeMillis();
+            timeFinished = getCurrentTimeMilliseconds();
             super.renderDone();
         }
 
@@ -111,6 +111,10 @@ public class RenderBenchmarkCollector {
         }
     }
 
+    public static long getCurrentTimeMilliseconds() {
+        return System.nanoTime() / 1000000; // System.currentTimeMillis has low accuracy, sometimes multiples of 16ms
+    }
+
     /**
      * A special version of the benchmark class that logs the output to stderr.
      * @author Michael Zangl
diff --git a/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java b/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java
index f2bbfa362..194f4d8b7 100644
--- a/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java
+++ b/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java
@@ -3,12 +3,14 @@ package org.openstreetmap.josm.gui.mappaint;
 
 import java.awt.Color;
 import java.awt.Graphics2D;
+import java.awt.Point;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.List;
@@ -34,7 +36,6 @@ import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
 import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer.StyleRecord;
 import org.openstreetmap.josm.data.preferences.sources.SourceEntry;
 import org.openstreetmap.josm.data.projection.ProjectionRegistry;
-import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.mappaint.StyleSetting.BooleanStyleSetting;
 import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader;
@@ -45,10 +46,11 @@ import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.OsmReader;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
-import org.openstreetmap.josm.tools.Logging;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
+import static org.junit.Assert.assertEquals;
+
 /**
  * Performance test of map renderer.
  */
@@ -99,11 +101,27 @@ public class MapRendererPerformanceTest {
 
         img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
         g = (Graphics2D) img.getGraphics();
-        g.setClip(0, 0, IMG_WIDTH, IMG_WIDTH);
+        g.setClip(0, 0, IMG_WIDTH, IMG_HEIGHT);
         g.setColor(Color.BLACK);
-        g.fillRect(0, 0, IMG_WIDTH, IMG_WIDTH);
-        nc = MainApplication.getMap().mapView;
-        nc.setBounds(0, 0, IMG_WIDTH, IMG_HEIGHT);
+        g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
+
+        nc = new NavigatableComponent() {
+            {
+                setBounds(0, 0, IMG_WIDTH, IMG_HEIGHT);
+                updateLocationState();
+            }
+
+            @Override
+            protected boolean isVisibleOnScreen() {
+                return true;
+            }
+
+            @Override
+            public Point getLocationOnScreen() {
+                return new Point(0, 0);
+            }
+        };
+        nc.zoomTo(BOUNDS_CITY_ALL);
 
         MapPaintStyles.readFromPreferences();
 
@@ -174,8 +192,8 @@ public class MapRendererPerformanceTest {
         public double scale = 0;
         public LatLon center = LL_CITY;
         public Bounds bounds;
-        public int noWarmup = 3;
-        public int noIterations = 7;
+        public int noWarmup = 20;
+        public int noIterations = 30;
         public boolean dumpImage = DUMP_IMAGE;
         public boolean clearStyleCache = true;
         public String label = "";
@@ -207,21 +225,16 @@ public class MapRendererPerformanceTest {
             }
 
             StyledMapRenderer renderer = new StyledMapRenderer(g, nc, false);
+            assertEquals(IMG_WIDTH, (int) nc.getState().getViewWidth());
+            assertEquals(IMG_HEIGHT, (int) nc.getState().getViewHeight());
 
             int noTotal = noWarmup + noIterations;
             for (int i = 1; i <= noTotal; i++) {
                 g.setColor(Color.BLACK);
-                g.fillRect(0, 0, IMG_WIDTH, IMG_WIDTH);
+                g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
                 if (clearStyleCache) {
                     MapPaintStyles.getStyles().clearCached();
                 }
-                System.gc();
-                System.runFinalization();
-                try {
-                    Thread.sleep(300);
-                } catch (InterruptedException ex) {
-                    Logging.warn(ex);
-                }
                 BenchmarkData data = new BenchmarkData();
                 renderer.setBenchmarkFactory(() -> data);
                 renderer.render(dsCity, false, bounds);
@@ -233,7 +246,7 @@ public class MapRendererPerformanceTest {
                     totalTimes.add(data.getGenerateTime() + data.getSortTime() + data.getDrawTime());
                 }
                 if (i == 1) {
-                    dumpElementCount(data);
+                    data.dumpElementCount();
                 }
                 dumpTimes(data);
                 if (dumpImage && i == noTotal) {
@@ -275,8 +288,6 @@ public class MapRendererPerformanceTest {
         test.bounds = BOUNDS_CITY_ALL;
         test.label = "big";
         test.dumpImage = false;
-        test.noWarmup = 3;
-        test.noIterations = 10;
         test.mpGenerate = true;
         test.clearStyleCache = true;
         test.run();
@@ -284,8 +295,6 @@ public class MapRendererPerformanceTest {
 
     private static void testDrawFeature(Feature feature) throws IOException {
         PerformanceTester test = new PerformanceTester();
-        test.noWarmup = 3;
-        test.noIterations = 10;
         test.mpDraw = true;
         test.clearStyleCache = false;
         if (feature != null) {
@@ -301,6 +310,7 @@ public class MapRendererPerformanceTest {
             setFilterStyleActive(false);
         }
         MapPaintStyleLoader.reloadStyles(filterStyleIdx);
+        dsCity.clearMappaintCache();
         test.run();
     }
 
@@ -342,12 +352,7 @@ public class MapRendererPerformanceTest {
     }
 
     public static void dumpTimes(BenchmarkData bd) {
-        System.out.print(String.format("gen. %3d, sort %3d, draw %3d%n", bd.getGenerateTime(), bd.getSortTime(), bd.getDrawTime()));
-    }
-
-    public static void dumpElementCount(BenchmarkData bd) {
-        System.out.println(bd.recordElementStats().entrySet().stream()
-                .map(e -> e.getKey().getSimpleName().replace("Element", "") + ":" + e.getValue()).collect(Collectors.joining(" ")));
+        System.out.print(String.format("gen. %4d, sort %4d, draw %4d%n", bd.getGenerateTime(), bd.getSortTime(), bd.getDrawTime()));
     }
 
     public static class BenchmarkData extends CapturingBenchmark {
@@ -372,5 +377,12 @@ public class MapRendererPerformanceTest {
             }
             return styleElementCount;
         }
+
+        public void dumpElementCount() {
+            System.out.println(recordElementStats().entrySet().stream()
+                    .sorted(Comparator.comparing(e -> e.getKey().getSimpleName()))
+                    .map(e -> e.getKey().getSimpleName().replace("Element", "") + ":" + e.getValue())
+                    .collect(Collectors.joining(" ")));
+        }
     }
 }
