From 9893c443e12eb0d52b0937de519d1df1c885196c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Reimar=20D=C3=B6ffinger?= Date: Fri, 17 Apr 2020 01:19:51 +0200 Subject: [PATCH] Add parallel HashMap for faster lookups. --- .../dictionary/engine/IndexBuilder.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/com/hughes/android/dictionary/engine/IndexBuilder.java b/src/com/hughes/android/dictionary/engine/IndexBuilder.java index d37f9d1..2db537b 100644 --- a/src/com/hughes/android/dictionary/engine/IndexBuilder.java +++ b/src/com/hughes/android/dictionary/engine/IndexBuilder.java @@ -14,16 +14,7 @@ package com.hughes.android.dictionary.engine; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.EnumMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.TreeMap; +import java.util.*; import com.hughes.android.dictionary.engine.Index.IndexEntry; import com.hughes.android.dictionary.parser.DictFileParser; @@ -34,12 +25,14 @@ public class IndexBuilder { public final Index index; final Set stoplist; + final Map fastTokenToData; final SortedMap tokenToData; IndexBuilder(final DictionaryBuilder dictionaryBuilder, final String shortName, final String longName, final Language language, final String normalizerRules, final Set stoplist, final boolean swapPairEntries) { this.dictionaryBuilder = dictionaryBuilder; index = new Index(dictionaryBuilder.dictionary, shortName, longName, language, normalizerRules, swapPairEntries, stoplist); tokenToData = new TreeMap<>(new FastNormalizeComparator(index.getSortComparator())); + fastTokenToData = new HashMap<>(); this.stoplist = stoplist; } @@ -125,12 +118,16 @@ public class IndexBuilder { } public TokenData getOrCreateTokenData(final String token) { + TokenData tokenData = fastTokenToData.get(token); + if (tokenData != null) return tokenData; + tokenData = new TokenData(token); final FastCompareString c = new FastCompareString(token); - TokenData tokenData = tokenToData.get(c); - if (tokenData == null) { - tokenData = new TokenData(token); - tokenToData.put(c, tokenData); + if (tokenToData.put(c, tokenData) != null) { + // The parallel HashMap assumes that the TreeMap Comparator + // is compatible with the equals it uses to compare. + throw new RuntimeException("TokenData TreeMap and HashMap out of sync, Comparator may be broken?"); } + fastTokenToData.put(token, tokenData); return tokenData; } -- 2.43.0