Fix binary reading code performance.

This is not the Right fix ; the Right fix would be to read
the file in a buffered way. However this delivers tolerable
performance for a minimal amount of code changes.
We may want to skip submitting this patch, but keep it around
in case we need to use the functionality until we have a good
patch.

Change-Id: I1ba938f82acfd9436c3701d1078ff981afdbea60
main
Jean Chalard 2012-04-24 12:54:44 +09:00
parent 5ee0ee0dbe
commit 1d80a7f395
1 changed files with 10 additions and 1 deletions

View File

@ -1122,6 +1122,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. * Finds, as a string, the word at the address passed as an argument.
* *
@ -1131,8 +1137,10 @@ public class BinaryDictInputOutput {
* @return the word, as a string. * @return the word, as a string.
* @throws IOException if the file can't be read. * @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 { int address) throws IOException {
final String cachedString = wordCache.get(address);
if (null != cachedString) return cachedString;
final long originalPointer = source.getFilePointer(); final long originalPointer = source.getFilePointer();
source.seek(headerSize); source.seek(headerSize);
final int count = readCharGroupCount(source); final int count = readCharGroupCount(source);
@ -1171,6 +1179,7 @@ public class BinaryDictInputOutput {
} }
} }
source.seek(originalPointer); source.seek(originalPointer);
wordCache.put(address, result);
return result; return result;
} }