On Sun, 7 Aug 2011 12:24:46 -0500, "Patrick R. Michaud"
<[email protected]> wrote:
Starting with Parrot 1.4.0 and continuing through Parrot 2.6.0,
iterating a Hash would return elements in a different order than
the order used to create the Hash.
Starting with Parrot 2.9.1, hash iterators appear to be using
the creation order again, and I'm curious to know why this
is the case. See code sample and output below.
Yes, I recognize that Parrot returning ordered keys for hashes
is technically valid, since Parrot is allowed to return hash
keys in whatever order it wants. But Rakudo experienced some
significant pain with the Parrot 1.4.0 release due to an
unexpected reliance on hash key ordering, and so it might be
worth knowing why/how Parrot has reverted to the pre-1.4.0 behavior.
For some types of keys (that have zero/NULL as valid value, i.e.
integer, ptr, cstring) parrot iterates keys in index order, not
ordered by creation.
For the rest of key types it iterates them in memory order, that is
the same as create order, if there were no key deleted. This is faster
because it has less computation and a lot less data cache fails,
especially with big hashes.
The change arround 2.9 was part of optimization of parrot hashes done
by me and chromatic. We were optimizing for the common case that is
having String hash keys.
--
Luben Karavelov
_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev