py/persistentcode: Add a qstr window to save mpy files more efficiently.

This is an implementation of a sliding qstr window used to reduce the
number of qstrs stored in a .mpy file.  The window size is configured to 32
entries which takes a fixed 64 bytes (16-bits each) on the C stack when
loading/saving a .mpy file.  It allows to remember the most recent 32 qstrs
so they don't need to be stored again in the .mpy file.  The qstr window
uses a simple least-recently-used mechanism to discard the least recently
used qstr when the window overflows (similar to dictionary compression).
This scheme only needs a single pass to save/load the .mpy file.

Reduces mpy file size by about 25% with a window size of 32.
This commit is contained in:
Damien George
2019-02-25 23:15:51 +11:00
parent 5a2599d962
commit 5996eeb48f
4 changed files with 140 additions and 40 deletions

View File

@@ -48,6 +48,7 @@ user_files = {
'/mod0.mpy': b'', # empty file
'/mod1.mpy': b'M', # too short header
'/mod2.mpy': b'M\x00\x00\x00', # bad version
'/mod3.mpy': b'M\x00\x00\x00\x7f', # qstr window too large
}
# create and mount a user filesystem

View File

@@ -1,3 +1,4 @@
mod0 ValueError incompatible .mpy file
mod1 ValueError incompatible .mpy file
mod2 ValueError incompatible .mpy file
mod3 ValueError incompatible .mpy file