Ticket #11709: 0002-Added-a-new-MapCSS-performance-test-for-the-rule-ind.patch

File 0002-Added-a-new-MapCSS-performance-test-for-the-rule-ind.patch, 5.8 KB (added by michael2402, 10 years ago)
  • new file test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java

    From 6cccdb21dd9a0b45d6eb934c5972707008b65478 Mon Sep 17 00:00:00 2001
    From: Michael Zangl <michael.zangl@student.kit.edu>
    Date: Mon, 20 Jul 2015 14:17:19 +0200
    Subject: [PATCH 2/4] Added a new MapCSS performance test for the rule index.
    
    ---
     .../mapcss/MapCSSStyleSourceFilterTest.java        | 146 +++++++++++++++++++++
     1 file changed, 146 insertions(+)
     create mode 100644 test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java
    
    diff --git a/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java b/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java
    new file mode 100644
    index 0000000..8b28279
    - +  
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.gui.mappaint.mapcss;
     3
     4import org.junit.BeforeClass;
     5import org.junit.Test;
     6import org.openstreetmap.josm.JOSMFixture;
     7import org.openstreetmap.josm.PerformanceTestUtils;
     8import org.openstreetmap.josm.PerformanceTestUtils.PerformanceTestTimer;
     9import org.openstreetmap.josm.data.osm.OsmDataGenerator;
     10import org.openstreetmap.josm.data.osm.OsmDataGenerator.KeyValueDataGenerator;
     11import org.openstreetmap.josm.gui.mappaint.MultiCascade;
     12
     13/**
     14 * Tests how fast {@link MapCSSStyleSource} finds the right style candidates for one object.
     15 * @author Michael Zangl
     16 */
     17public class MapCSSStyleSourceFilterTest {
     18
     19    private static final int TEST_RULE_COUNT = 10000;
     20
     21    private class CssGenerator {
     22        StringBuilder sb = new StringBuilder();
     23        private KeyValueDataGenerator generator;
     24
     25        /**
     26         * Create a new CSS generator.
     27         * @param generator A generator to get the keys from.
     28         */
     29        public CssGenerator(KeyValueDataGenerator generator) {
     30            this.generator = generator;
     31        }
     32
     33        private CssGenerator addKeyValueRules(int count) {
     34            for (int i = 0; i < count; i++) {
     35                String key = generator.randomKey();
     36                String value = generator.randomValue();
     37                addRule("node[\"" + key + "\"=\"" + value + "\"]");
     38            }
     39            return this;
     40        }
     41
     42        private CssGenerator addKeyRegexpRules(int count) {
     43            for (int i = 0; i < count; i++) {
     44                String key = generator.randomKey();
     45                String value = generator.randomValue();
     46                value = value.substring(i % value.length());
     47                addRule("node[\"" + key + "\"=~/.*" + value + ".*/]");
     48            }
     49            return this;
     50        }
     51
     52        public CssGenerator addHasKeyRules(int count) {
     53            for (int i = 0; i < count; i++) {
     54                String key = generator.randomKey();
     55                addRule("node[\"" + key + "\"]");
     56            }
     57            return this;
     58        }
     59
     60        public CssGenerator addIsTrueRules(int count) {
     61            for (int i = 0; i < count; i++) {
     62                String key = generator.randomKey();
     63                // TODO
     64                addRule("node[\"" + key + "\"?]");
     65            }
     66            return this;
     67        }
     68
     69        private void addRule(String selector) {
     70            sb.append(selector + " {}\n");
     71        }
     72
     73        public String getCss() {
     74            return sb.toString();
     75        }
     76    }
     77
     78    private static final int APPLY_CALLS = 1000000;
     79
     80    /**
     81     * Prepare the test.
     82     */
     83    @BeforeClass
     84    public static void createJOSMFixture() {
     85        JOSMFixture.createPerformanceTestFixture().init(true);
     86    }
     87
     88    /**
     89     * Time how long it takes to evaluate [key=value] rules
     90     */
     91    @Test
     92    public void testKeyValueRules() {
     93        KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
     94        data.generateDataSet();
     95        CssGenerator css = new CssGenerator(data).addKeyValueRules(TEST_RULE_COUNT);
     96        runTest(data, css, "only key=value rules");
     97    }
     98
     99    /**
     100     * Time how long it takes to evaluate [key] rules
     101     */
     102    @Test
     103    public void testKeyOnlyRules() {
     104        KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
     105        data.generateDataSet();
     106        CssGenerator css = new CssGenerator(data).addHasKeyRules(TEST_RULE_COUNT);
     107        runTest(data, css, "only has key rules");
     108    }
     109
     110    /**
     111     * Time how long it takes to evaluate [key=~...] rules
     112     */
     113    @Test
     114    public void testRegularExpressionRules() {
     115        KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
     116        data.generateDataSet();
     117        CssGenerator css = new CssGenerator(data).addKeyRegexpRules(TEST_RULE_COUNT);
     118        runTest(data, css, "regular expressions");
     119    }
     120
     121    /**
     122     * Time how long it takes to evaluate [key?] rules
     123     */
     124    @Test
     125    public void testIsTrueRules() {
     126        KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
     127        data.generateDataSet();
     128        CssGenerator css = new CssGenerator(data).addIsTrueRules(TEST_RULE_COUNT);
     129        runTest(data, css, "is true");
     130    }
     131
     132    private void runTest(KeyValueDataGenerator data, CssGenerator css, String description) {
     133        MapCSSStyleSource source = new MapCSSStyleSource(css.getCss());
     134        PerformanceTestTimer timer = PerformanceTestUtils.startTimer("MapCSSStyleSource#loadStyleSource(...) for " + description);
     135        source.loadStyleSource();
     136        timer.done();
     137
     138        timer = PerformanceTestUtils.startTimer("MapCSSStyleSource#apply(...) for " + description);
     139        for (int i = 0; i < APPLY_CALLS; i++) {
     140            MultiCascade mc = new MultiCascade();
     141            source.apply(mc, data.randomNode(), 1, false);
     142        }
     143        timer.done();
     144    }
     145
     146}