From: Reimar Döffinger Date: Sat, 29 Oct 2016 20:45:32 +0000 (+0200) Subject: Cache Transliterators. X-Git-Url: http://gitweb.fperrin.net/?p=Dictionary.git;a=commitdiff_plain;h=1bddeb2d640d92975e8041c0d0608624c5968080 Cache Transliterators. Since Android is too stupid to do it by itself. Improves performance of searching through all dictionaries by more than 8x. --- diff --git a/src/com/hughes/android/dictionary/engine/Index.java b/src/com/hughes/android/dictionary/engine/Index.java index 069cca7..665f42d 100644 --- a/src/com/hughes/android/dictionary/engine/Index.java +++ b/src/com/hughes/android/dictionary/engine/Index.java @@ -106,8 +106,7 @@ public final class Index implements RAFSerializable { */ public synchronized Transliterator normalizer() { if (normalizer == null) { - normalizer = Transliterator - .createFromRules("", normalizerRules, Transliterator.FORWARD); + normalizer = TransliteratorManager.get(normalizerRules); } return normalizer; } diff --git a/src/com/hughes/android/dictionary/engine/TransliteratorManager.java b/src/com/hughes/android/dictionary/engine/TransliteratorManager.java index c3bfe8a..cc8500f 100644 --- a/src/com/hughes/android/dictionary/engine/TransliteratorManager.java +++ b/src/com/hughes/android/dictionary/engine/TransliteratorManager.java @@ -14,6 +14,8 @@ package com.hughes.android.dictionary.engine; +import android.support.v4.util.LruCache; + import com.ibm.icu.text.Transliterator; import java.util.ArrayList; @@ -23,10 +25,20 @@ public class TransliteratorManager { private static boolean starting = false; private static boolean ready = false; + private static LruCache cache = new LruCache(4); // Whom to notify when we're all set up and ready to go. private static List callbacks = new ArrayList(); + public static synchronized Transliterator get(String rules) { + Transliterator result = cache.get(rules); + if (result == null) { + result = Transliterator.createFromRules("", rules, Transliterator.FORWARD); + cache.put(rules, result); + } + return result; + } + public static synchronized boolean init(final Callback callback) { if (ready) { return true; @@ -45,12 +57,7 @@ public class TransliteratorManager { @Override public void run() { System.out.println("Starting Transliterator load."); - final String transliterated = - Transliterator - .createFromRules( - "", - Language.en.getDefaultNormalizerRules(), - Transliterator.FORWARD).transliterate("Îñţérñåţîöñåļîžåţîờñ"); + final String transliterated = get(Language.en.getDefaultNormalizerRules()).transliterate("Îñţérñåţîöñåļîžåţîờñ"); if (!"internationalization".equals(transliterated)) { System.out.println("Wrong transliteration: " + transliterated); }