fix slowdown in nested hash freeing
authorDavid Mitchell <davem@iabyn.com>
Tue, 6 Mar 2012 14:26:27 +0000 (14:26 +0000)
committerDavid Mitchell <davem@iabyn.com>
Tue, 6 Mar 2012 14:26:27 +0000 (14:26 +0000)
commit5bec93bead1c10563a402404de095bbdf398790f
tree6804fecb854a7340fe5301eb0577d0ebf41173a1
parent1cd16d8ac049ac3ffe94281e35fe9270b854408d
fix slowdown in nested hash freeing

Commit 104d7b69 made sv_clear free hashes iteratively rather than recursively;
however, my code didn't record the current hash index when freeing a
nested hash, which made the code go quadratic when freeing a large hash
with inner hashes, e.g.:

    my $r; $r->{$_} = { a => 1 } for 1..10_0000;

This was noticeable on such things as CPAN.pm being very slow to exit.

This commit fixes this by squirrelling away the old hash index in the
now-unused SvMAGIC field of the hash being freed.
hv.c
sv.c
sv.h