Ticket #19225: fix-MapRendererPerformanceTest.patch

File fix-MapRendererPerformanceTest.patch, 8.7 KB (added by johsin18, 6 years ago)
  • src/org/openstreetmap/josm/data/osm/visitor/paint/RenderBenchmarkCollector.java

    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 b public class RenderBenchmarkCollector {  
    6464
    6565        @Override
    6666        public void renderStart(double circum) {
    67             timeStart = System.currentTimeMillis();
     67            timeStart = getCurrentTimeMilliseconds();
    6868            super.renderStart(circum);
    6969        }
    7070
    7171        @Override
    7272        public boolean renderSort() {
    73             timeGenerateDone = System.currentTimeMillis();
     73            timeGenerateDone = getCurrentTimeMilliseconds();
    7474            return super.renderSort();
    7575        }
    7676
    7777        @Override
    7878        public boolean renderDraw(List<StyleRecord> allStyleElems) {
    79             timeSortingDone = System.currentTimeMillis();
     79            timeSortingDone = getCurrentTimeMilliseconds();
    8080            return super.renderDraw(allStyleElems);
    8181        }
    8282
    public class RenderBenchmarkCollector {  
    9898
    9999        @Override
    100100        public void renderDone() {
    101             timeFinished = System.currentTimeMillis();
     101            timeFinished = getCurrentTimeMilliseconds();
    102102            super.renderDone();
    103103        }
    104104
    public class RenderBenchmarkCollector {  
    111111        }
    112112    }
    113113
     114    public static long getCurrentTimeMilliseconds() {
     115        return System.nanoTime() / 1000000; // System.currentTimeMillis has low accuracy, sometimes multiples of 16ms
     116    }
     117
    114118    /**
    115119     * A special version of the benchmark class that logs the output to stderr.
    116120     * @author Michael Zangl
  • test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java

    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 b package org.openstreetmap.josm.gui.mappaint;  
    33
    44import java.awt.Color;
    55import java.awt.Graphics2D;
     6import java.awt.Point;
    67import java.awt.image.BufferedImage;
    78import java.io.File;
    89import java.io.IOException;
    910import java.io.InputStream;
    1011import java.util.ArrayList;
    1112import java.util.Collections;
     13import java.util.Comparator;
    1214import java.util.EnumMap;
    1315import java.util.HashMap;
    1416import java.util.List;
    import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;  
    3436import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer.StyleRecord;
    3537import org.openstreetmap.josm.data.preferences.sources.SourceEntry;
    3638import org.openstreetmap.josm.data.projection.ProjectionRegistry;
    37 import org.openstreetmap.josm.gui.MainApplication;
    3839import org.openstreetmap.josm.gui.NavigatableComponent;
    3940import org.openstreetmap.josm.gui.mappaint.StyleSetting.BooleanStyleSetting;
    4041import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader;
    import org.openstreetmap.josm.gui.progress.NullProgressMonitor;  
    4546import org.openstreetmap.josm.io.Compression;
    4647import org.openstreetmap.josm.io.OsmReader;
    4748import org.openstreetmap.josm.testutils.JOSMTestRules;
    48 import org.openstreetmap.josm.tools.Logging;
    4949
    5050import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
    5151
     52import static org.junit.Assert.assertEquals;
     53
    5254/**
    5355 * Performance test of map renderer.
    5456 */
    public class MapRendererPerformanceTest {  
    99101
    100102        img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
    101103        g = (Graphics2D) img.getGraphics();
    102         g.setClip(0, 0, IMG_WIDTH, IMG_WIDTH);
     104        g.setClip(0, 0, IMG_WIDTH, IMG_HEIGHT);
    103105        g.setColor(Color.BLACK);
    104         g.fillRect(0, 0, IMG_WIDTH, IMG_WIDTH);
    105         nc = MainApplication.getMap().mapView;
    106         nc.setBounds(0, 0, IMG_WIDTH, IMG_HEIGHT);
     106        g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
     107
     108        nc = new NavigatableComponent() {
     109            {
     110                setBounds(0, 0, IMG_WIDTH, IMG_HEIGHT);
     111                updateLocationState();
     112            }
     113
     114            @Override
     115            protected boolean isVisibleOnScreen() {
     116                return true;
     117            }
     118
     119            @Override
     120            public Point getLocationOnScreen() {
     121                return new Point(0, 0);
     122            }
     123        };
     124        nc.zoomTo(BOUNDS_CITY_ALL);
    107125
    108126        MapPaintStyles.readFromPreferences();
    109127
    public class MapRendererPerformanceTest {  
    174192        public double scale = 0;
    175193        public LatLon center = LL_CITY;
    176194        public Bounds bounds;
    177         public int noWarmup = 3;
    178         public int noIterations = 7;
     195        public int noWarmup = 20;
     196        public int noIterations = 30;
    179197        public boolean dumpImage = DUMP_IMAGE;
    180198        public boolean clearStyleCache = true;
    181199        public String label = "";
    public class MapRendererPerformanceTest {  
    207225            }
    208226
    209227            StyledMapRenderer renderer = new StyledMapRenderer(g, nc, false);
     228            assertEquals(IMG_WIDTH, (int) nc.getState().getViewWidth());
     229            assertEquals(IMG_HEIGHT, (int) nc.getState().getViewHeight());
    210230
    211231            int noTotal = noWarmup + noIterations;
    212232            for (int i = 1; i <= noTotal; i++) {
    213233                g.setColor(Color.BLACK);
    214                 g.fillRect(0, 0, IMG_WIDTH, IMG_WIDTH);
     234                g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
    215235                if (clearStyleCache) {
    216236                    MapPaintStyles.getStyles().clearCached();
    217237                }
    218                 System.gc();
    219                 System.runFinalization();
    220                 try {
    221                     Thread.sleep(300);
    222                 } catch (InterruptedException ex) {
    223                     Logging.warn(ex);
    224                 }
    225238                BenchmarkData data = new BenchmarkData();
    226239                renderer.setBenchmarkFactory(() -> data);
    227240                renderer.render(dsCity, false, bounds);
    public class MapRendererPerformanceTest {  
    233246                    totalTimes.add(data.getGenerateTime() + data.getSortTime() + data.getDrawTime());
    234247                }
    235248                if (i == 1) {
    236                     dumpElementCount(data);
     249                    data.dumpElementCount();
    237250                }
    238251                dumpTimes(data);
    239252                if (dumpImage && i == noTotal) {
    public class MapRendererPerformanceTest {  
    275288        test.bounds = BOUNDS_CITY_ALL;
    276289        test.label = "big";
    277290        test.dumpImage = false;
    278         test.noWarmup = 3;
    279         test.noIterations = 10;
    280291        test.mpGenerate = true;
    281292        test.clearStyleCache = true;
    282293        test.run();
    public class MapRendererPerformanceTest {  
    284295
    285296    private static void testDrawFeature(Feature feature) throws IOException {
    286297        PerformanceTester test = new PerformanceTester();
    287         test.noWarmup = 3;
    288         test.noIterations = 10;
    289298        test.mpDraw = true;
    290299        test.clearStyleCache = false;
    291300        if (feature != null) {
    public class MapRendererPerformanceTest {  
    301310            setFilterStyleActive(false);
    302311        }
    303312        MapPaintStyleLoader.reloadStyles(filterStyleIdx);
     313        dsCity.clearMappaintCache();
    304314        test.run();
    305315    }
    306316
    public class MapRendererPerformanceTest {  
    342352    }
    343353
    344354    public static void dumpTimes(BenchmarkData bd) {
    345         System.out.print(String.format("gen. %3d, sort %3d, draw %3d%n", bd.getGenerateTime(), bd.getSortTime(), bd.getDrawTime()));
    346     }
    347 
    348     public static void dumpElementCount(BenchmarkData bd) {
    349         System.out.println(bd.recordElementStats().entrySet().stream()
    350                 .map(e -> e.getKey().getSimpleName().replace("Element", "") + ":" + e.getValue()).collect(Collectors.joining(" ")));
     355        System.out.print(String.format("gen. %4d, sort %4d, draw %4d%n", bd.getGenerateTime(), bd.getSortTime(), bd.getDrawTime()));
    351356    }
    352357
    353358    public static class BenchmarkData extends CapturingBenchmark {
    public class MapRendererPerformanceTest {  
    372377            }
    373378            return styleElementCount;
    374379        }
     380
     381        public void dumpElementCount() {
     382            System.out.println(recordElementStats().entrySet().stream()
     383                    .sorted(Comparator.comparing(e -> e.getKey().getSimpleName()))
     384                    .map(e -> e.getKey().getSimpleName().replace("Element", "") + ":" + e.getValue())
     385                    .collect(Collectors.joining(" ")));
     386        }
    375387    }
    376388}