In message <[EMAIL PROTECTED]> (on 16
December 2004 16:45:01 +1100), [EMAIL PROTECTED] (Andrew Savige) wrote:
>Steve Hay wrote:
>> is even worse: 1 second again on 5.8.6/perl-malloc versus 56
>> seconds on 5.8.4/system-malloc!
>
>I'm pretty sure realloc() is the culprit here.
>A common trick used by string classes is to double the memory
>allocation whenever you need to grow a string, and so avoid
>O(n-squared) performance when growing a string one char at a time.
>
>For cheap thrills, I created the following patch against 5.8.6
>to hack this memory doubling trick into Perl_sv_catpvn_flags():
>
>--- sv-orig.c 2004-11-02 03:01:54.000000000 +1100
>+++ sv.c 2004-12-16 15:04:39.000000000 +1100
>@@ -4394,9 +4394,14 @@
> {
> STRLEN dlen;
> char *dstr;
>+ STRLEN neededlen;
>
> dstr = SvPV_force_flags(dsv, dlen, flags);
>- SvGROW(dsv, dlen + slen + 1);
>+ neededlen = dlen + slen + 1;
>+ if (SvLEN(dsv) < neededlen) {
>+ STRLEN s2 = SvLEN(dsv) * 2;
>+ SvGROW(dsv, s2 < neededlen ? neededlen : s2);
>+ }
> if (sstr == dstr)
> sstr = SvPVX(dsv);
> Move(sstr, SvPVX(dsv) + dlen, slen, char);
>
>Though all tests passed, I don't know Perl internals well enough to
>judge whether this hacky change is sound or not. I did it only out
>of curiosity to see how it affected Steve's little benchmark.
>
>After applying this patch, the performance of Steve's test program
>above dropped from 26 seconds to 1 second when run on Windows XP
>(when built with default system malloc). BTW, on Linux, the
>improvement was hardly noticeable: from 0.86 secs to 0.51.
>
>I'm interested to hear opinions on whether these sort of memory
>heuristics are best done in the perl core or left to realloc().
Note that usage of perl's malloc is not an option on some systems (e.g.,
IRIX) - so putting improvements in perl's malloc, if I understand you
properly, is not helpful on said systems.
-Allen
--
Allen Smith http://cesario.rutgers.edu/easmith/
February 1, 2003 Space Shuttle Columbia
Ad Astra Per Aspera To The Stars Through Asperity