Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d80a7f3 authored by Jean Chalard's avatar Jean Chalard
Browse files

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
parent 5ee0ee0d
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -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.
     *
@@ -1131,8 +1137,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);
@@ -1171,6 +1179,7 @@ public class BinaryDictInputOutput {
            }
        }
        source.seek(originalPointer);
        wordCache.put(address, result);
        return result;
    }