// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.mappaint.mapcss;
import java.util.EnumSet;
import org.junit.Test;
import org.openstreetmap.josm.PerformanceTestUtils;
import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.Op;
/**
* Performance test of MapCSS Condition objects.
* @author Michael Zangl
*/
public class MapCSSConditionPerformanceTest {
/**
* Test the performance of all OP entries.
*/
@Test
public void testAllOps() {
// The JIT does some really heavy optimisations if it notices that other values are not used.
// If we want to simulate a real scenario, we need to invoke every op several times to let the compiler
// build the jump tables.
for (Op op : Op.values()) {
getRunner(op).run();
}
for (Op op : Op.values()) {
runTest(op);
}
}
private void runTest(Op op) {
Runnable r = getRunner(op);
PerformanceTestUtils.runPerformanceTest("Condition.Op." + op, r);
}
private Runnable getRunner(Op op) {
Runnable r;
if (EnumSet.of(Op.LESS, Op.LESS_OR_EQUAL, Op.GREATER, Op.GREATER_OR_EQUAL).contains(op)) {
r = () -> {
for (int i = 0; i < 10000; i++) {
op.eval(null, "0.2");
op.eval("nan", "0.1");
op.eval("0.2983", "192.312");
op.eval("0.2983", "0.2983");
op.eval("2983", "1000");
op.eval("1000", "1000");
}
};
} else {
// regexp are slow
int runs = EnumSet.of(Op.ONE_OF, Op.REGEX, Op.NREGEX).contains(op) ? 10000 : 100000;
r = () -> {
for (int i = 0; i < runs; i++) {
op.eval("k1", "v1");
op.eval("k1", "k1");
op.eval("", "v1");
op.eval(null, "abc");
op.eval("extreamlylongkeyextreamlylongkeyextreamlylongkeyextreamlylongkey",
"longvaluelongvaluelongvaluelongvalue");
op.eval("0.2983", "192.312");
op.eval("0.2983", "0.2983");
op.eval("2983", "\\d+");
}
};
}
return r;
}
}