source: josm/trunk/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java@ 8623

Last change on this file since 8623 was 8623, checked in by bastiK, 9 years ago

applied #11709 - New performance test for MapCSSStyleSource#apply and for OsmPrimitive#get/put/getKeys (patch by michael2402)

  • Property svn:eol-style set to native
File size: 4.8 KB
Line 
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 addRule("node[\"" + key + "\"?]");
64 }
65 return this;
66 }
67
68 private void addRule(String selector) {
69 sb.append(selector + " {}\n");
70 }
71
72 public String getCss() {
73 return sb.toString();
74 }
75 }
76
77 private static final int APPLY_CALLS = 100000;
78
79 /**
80 * Prepare the test.
81 */
82 @BeforeClass
83 public static void createJOSMFixture() {
84 JOSMFixture.createPerformanceTestFixture().init(true);
85 }
86
87 /**
88 * Time how long it takes to evaluate [key=value] rules
89 */
90 @Test
91 public void testKeyValueRules() {
92 KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
93 data.generateDataSet();
94 CssGenerator css = new CssGenerator(data).addKeyValueRules(TEST_RULE_COUNT);
95 runTest(data, css, "only key=value rules");
96 }
97
98 /**
99 * Time how long it takes to evaluate [key] rules
100 */
101 @Test
102 public void testKeyOnlyRules() {
103 KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
104 data.generateDataSet();
105 CssGenerator css = new CssGenerator(data).addHasKeyRules(TEST_RULE_COUNT);
106 runTest(data, css, "only has key rules");
107 }
108
109 /**
110 * Time how long it takes to evaluate [key=~...] rules
111 */
112 @Test
113 public void testRegularExpressionRules() {
114 KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
115 data.generateDataSet();
116 CssGenerator css = new CssGenerator(data).addKeyRegexpRules(TEST_RULE_COUNT);
117 runTest(data, css, "regular expressions");
118 }
119
120 /**
121 * Time how long it takes to evaluate [key?] rules
122 */
123 @Test
124 public void testIsTrueRules() {
125 KeyValueDataGenerator data = OsmDataGenerator.getKeyValue();
126 data.generateDataSet();
127 CssGenerator css = new CssGenerator(data).addIsTrueRules(TEST_RULE_COUNT);
128 runTest(data, css, "is true");
129 }
130
131 private void runTest(KeyValueDataGenerator data, CssGenerator css, String description) {
132 MapCSSStyleSource source = new MapCSSStyleSource(css.getCss());
133 PerformanceTestTimer timer = PerformanceTestUtils.startTimer("MapCSSStyleSource#loadStyleSource(...) for " + description);
134 source.loadStyleSource();
135 timer.done();
136
137 timer = PerformanceTestUtils.startTimer(APPLY_CALLS + "x MapCSSStyleSource#apply(...) for " + description);
138 for (int i = 0; i < APPLY_CALLS; i++) {
139 MultiCascade mc = new MultiCascade();
140 source.apply(mc, data.randomNode(), 1, false);
141 }
142 timer.done();
143 }
144
145}
Note: See TracBrowser for help on using the repository browser.