diff options
author | 2012-04-23 23:39:37 -0700 | |
---|---|---|
committer | 2012-04-23 23:39:37 -0700 | |
commit | 805fed49e1b477a90ada4151dc4df89e5857c7e9 (patch) | |
tree | 84e73622cc3defebb2a4fb0b64895589e8354463 /java/src | |
parent | fe4d13cbcb1fde041dc319aa25bae68b6dabb902 (diff) | |
parent | 1d80a7f395290cd0e7344210bb3960f685059264 (diff) | |
download | latinime-805fed49e1b477a90ada4151dc4df89e5857c7e9.tar.gz latinime-805fed49e1b477a90ada4151dc4df89e5857c7e9.tar.xz latinime-805fed49e1b477a90ada4151dc4df89e5857c7e9.zip |
Merge "Fix binary reading code performance."
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java index b1bee4e65..cc98010fb 100644 --- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java +++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictInputOutput.java @@ -1142,6 +1142,12 @@ public class BinaryDictInputOutput { } } + // The word cache here is a stopgap bandaid to help the catastrophic performance + // of this method. Since it performs direct, unbuffered random access to the file and + // may be called hundreds of thousands of times, the resulting performance is not + // reasonable without some kind of cache. Thus: + // TODO: perform buffered I/O here and in other places in the code. + private static TreeMap<Integer, String> wordCache = new TreeMap<Integer, String>(); /** * Finds, as a string, the word at the address passed as an argument. * @@ -1151,8 +1157,10 @@ public class BinaryDictInputOutput { * @return the word, as a string. * @throws IOException if the file can't be read. */ - private static String getWordAtAddress(RandomAccessFile source, long headerSize, + private static String getWordAtAddress(final RandomAccessFile source, final long headerSize, int address) throws IOException { + final String cachedString = wordCache.get(address); + if (null != cachedString) return cachedString; final long originalPointer = source.getFilePointer(); source.seek(headerSize); final int count = readCharGroupCount(source); @@ -1191,6 +1199,7 @@ public class BinaryDictInputOutput { } } source.seek(originalPointer); + wordCache.put(address, result); return result; } |