Reimplementing WeakKeyDictionary
"Martin v. Löwis"
martin at v.loewis.de
Sun Mar 18 14:51:34 UTC 2007
I now have completed a first version of a reimplementation of
WeakKeyDictionary, with the objective of improving performance
(both computation and memory consumption). The entire change
with a discussion can be seen at
http://bugs.squeak.org/view.php?id=6348
In essence, this introduces two changes:
- when values are finalized or keys removed from the dictionary,
it is not always rehashed anymore. Instead, the dictionary just
releases the value, and marks the association as expired. Expired
associations can then be reused if a new value is to be inserted
under the same has. Rehashing is only done when so many entries
have expired. Expired entries don't count towards the size of the
dictionary, and aren't reported when iterating over the dictionary.
- WeakKeyAssociation was rewritten to be a weak class, with a fixed
slot for the value, and a weak slot for the key (currently, it
has two fixed slots, with the key slot referring to a WeakArray
of length 1).
In some measurements involving large (10000 keys) or many (10000)
small weak key dictionaries, this new implementation improves
performance by a factor of 4..5, when measuring finalization time.
The second change saves 8 bytes per association (on a 32-bit
machine).
Regards,
Martin
More information about the Squeak-dev
mailing list
|