We have revised the way we do String marshalling. We now make sure that all strings are stored along with their parent objects, in the same slot.
Doing this change was not all easy. We had to change the way slot lengths are calculated since all slots are now of variable length, whereas we could use fixed lengths for first class objects before.
Since we managed to reduce the number of IO operations both for reads and writes considerably, the change comes with a nice step up in performance.
In this benchmark we tried to document the improvements that we get from new string marshalling only. It has still been run with the old class index, so the results are nicely comparable.
Since we now store one byte of "marshalling family" information with each object, the update to the new marshalling format is seamless. Objects are updated when they are stored to the database the first time. This new procedure will easily allow us to support multiple new string encoding formats in the future.
To take advantage of the full performance improvement it is necessary to Defragment existing database files. Further details and recommendations have already been released in the recent BTree architecture posting.