Ticket #18455: 18455-performance.patch

File 18455-performance.patch, 3.1 KB (added by GerdP, 3 months ago)

POC: filter TaggingPreset.data to avoid tests which never match. Reduces runtime from ~10 secs to ~2 secs with my test data.

  • src/org/openstreetmap/josm/data/validation/tests/TagChecker.java

     
    1616import java.util.EnumSet;
    1717import java.util.HashMap;
    1818import java.util.HashSet;
     19import java.util.LinkedHashMap;
     20import java.util.LinkedHashSet;
    1921import java.util.List;
    2022import java.util.Locale;
    2123import java.util.Map;
     
    7880    private static volatile HashSet<String> additionalPresetsValueData;
    7981    /** often used tags which are not in presets */
    8082    private static volatile MultiMap<String, String> oftenUsedTags = new MultiMap<>();
     83    private static final Map<TaggingPreset, List<TaggingPresetItem>> presetIndex = new LinkedHashMap<>();
    8184
    8285    private static final Pattern UNWANTED_NON_PRINTING_CONTROL_CHARACTERS = Pattern.compile(
    8386            "[\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F\\u200e-\\u200f\\u202a-\\u202e]");
     
    243246        harmonizedKeys.clear();
    244247        ignoreForLevenshtein.clear();
    245248        oftenUsedTags.clear();
     249        presetIndex.clear();
    246250
    247251        StringBuilder errorSources = new StringBuilder();
    248252        for (String source : Config.getPref().getList(PREF_SOURCES, DEFAULT_SOURCES)) {
     
    364368        if (!presets.isEmpty()) {
    365369            initAdditionalPresetsValueData();
    366370            for (TaggingPreset p : presets) {
     371                List<TaggingPresetItem> minData = new ArrayList<>();
    367372                for (TaggingPresetItem i : p.data) {
    368373                    if (i instanceof KeyedItem) {
     374                        if (!"none".equals(((KeyedItem) i).match))
     375                            minData.add(i);
    369376                        addPresetValue((KeyedItem) i);
    370377                    } else if (i instanceof CheckGroup) {
    371378                        for (Check c : ((CheckGroup) i).checks) {
     
    373380                        }
    374381                    }
    375382                }
     383                if (!minData.isEmpty()) {
     384                    presetIndex .put(p, minData);
     385                }
    376386            }
    377387        }
    378388    }
     
    621631            TagMap tags = p.getKeys();
    622632            TaggingPresetType presetType = TaggingPresetType.forPrimitive(p);
    623633            EnumSet<TaggingPresetType> presetTypes = EnumSet.of(presetType);
    624             Collection<TaggingPreset> matchingPresets = TaggingPresets.getMatchingPresets(null, tags, false);
     634
     635            Collection<TaggingPreset> matchingPresets = new LinkedHashSet<>();
     636            for (Entry<TaggingPreset, List<TaggingPresetItem>> e : presetIndex.entrySet()) {
     637                if (TaggingPresetItem.matches(e.getValue(), tags)) {
     638                    matchingPresets.add(e.getKey());
     639                }
     640            }
    625641            Collection<TaggingPreset> matchingPresetsOK = matchingPresets.stream().filter(
    626642                    tp -> tp.typeMatches(presetTypes)).collect(Collectors.toList());
    627643            Collection<TaggingPreset> matchingPresetsKO = matchingPresets.stream().filter(