Merge "Add distracter cache to optimize the distracter test."

This commit is contained in:
Keisuke Kuroyanagi 2014-06-09 05:35:46 +00:00 committed by Android (Google) Code Review
commit 7f0316c27e

View file

@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.util.Log;
import android.util.LruCache;
import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.latin.DictionaryFacilitator; import com.android.inputmethod.latin.DictionaryFacilitator;
@ -36,9 +37,11 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
private static final long TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS = 120; private static final long TIMEOUT_TO_WAIT_LOADING_DICTIONARIES_IN_SECONDS = 120;
private static final int MAX_DISTRACTERS_CACHE_SIZE = 512;
private final Context mContext; private final Context mContext;
private final DictionaryFacilitator mDictionaryFacilitator; private final DictionaryFacilitator mDictionaryFacilitator;
private final LruCache<String, Boolean> mDistractersCache;
private final Object mLock = new Object(); private final Object mLock = new Object();
/** /**
@ -49,6 +52,7 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
public DistracterFilterCheckingExactMatches(final Context context) { public DistracterFilterCheckingExactMatches(final Context context) {
mContext = context; mContext = context;
mDictionaryFacilitator = new DictionaryFacilitator(); mDictionaryFacilitator = new DictionaryFacilitator();
mDistractersCache = new LruCache<>(MAX_DISTRACTERS_CACHE_SIZE);
} }
@Override @Override
@ -87,6 +91,7 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
synchronized (mLock) { synchronized (mLock) {
// Reset dictionaries for the locale. // Reset dictionaries for the locale.
try { try {
mDistractersCache.evictAll();
loadDictionariesForLocale(locale); loadDictionariesForLocale(locale);
} catch (final InterruptedException e) { } catch (final InterruptedException e) {
Log.e(TAG, "Interrupted while waiting for loading dicts in DistracterFilter", Log.e(TAG, "Interrupted while waiting for loading dicts in DistracterFilter",
@ -95,6 +100,15 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
} }
} }
} }
final Boolean isCachedDistracter = mDistractersCache.get(testedWord);
if (isCachedDistracter != null && isCachedDistracter) {
if (DEBUG) {
Log.d(TAG, "testedWord: " + testedWord);
Log.d(TAG, "isDistracter: true (cache hit)");
}
return true;
}
// The tested word is a distracter when there is a word that is exact matched to the tested // The tested word is a distracter when there is a word that is exact matched to the tested
// word and its probability is higher than the tested word's probability. // word and its probability is higher than the tested word's probability.
final int perfectMatchFreq = mDictionaryFacilitator.getFrequency(testedWord); final int perfectMatchFreq = mDictionaryFacilitator.getFrequency(testedWord);
@ -106,6 +120,10 @@ public class DistracterFilterCheckingExactMatches implements DistracterFilter {
Log.d(TAG, "exactMatchFreq: " + exactMatchFreq); Log.d(TAG, "exactMatchFreq: " + exactMatchFreq);
Log.d(TAG, "isDistracter: " + isDistracter); Log.d(TAG, "isDistracter: " + isDistracter);
} }
if (isDistracter) {
// Add the word to the cache.
mDistractersCache.put(testedWord, Boolean.TRUE);
}
return isDistracter; return isDistracter;
} }
} }