From: Ilya Zakharevich <ilya@math.ohio-state.edu>
Date: Tue, 21 Jan 1997 03:05:39 +0000 (-0500)
Subject: Efficiency patchlet for pp_aassign()
X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=7e42bd57a6867e174bc3bc555c3268b485940a98;p=p5sagit%2Fp5-mst-13.2.git

Efficiency patchlet for pp_aassign()
Ilya Zakharevich writes:
>
> With this patch applied the Tom's program
>       use integer;
>       @a=map int(rand(30000)), 1..100000;
>       @b = sort {$a <=> $b} @a;
>
> Runs in 10.3M (sbrk-en).

Here is another tiny patch to pp_aassign: it preallocates the
array. Memory saving is not very big for the above script (5%), but the
speed advantage may be bigger.

[patch]

> Memory allocation statistics after compilation: (buckets 8..524288)
>    13080 free:    13   109    39     2    13   2   3     2   2 0 0 0 0 0 0 0 0
>  4933288 used:   211   251   519   184    35   6   5  3226   3 0 1 0 0 0 0 0 3
> Total sbrk():  4960256. Odd ends: sbrk():       0, malloc():    1408 bytes.
> Memory allocation statistics after execution:   (buckets 8..1048576)
>   529848 free:    13   109    38     1    13   1   1     2   1 1 1 1 1 1 1 1 0 0
>  9782280 used:   211   251   520   185    35   7   7  5914   4 1 2 1 1 1 1 1 4 1
> Total sbrk(): 10375168. Odd ends: sbrk():       0, malloc():    1408 bytes.

Here is the new data, note the absense of "tails" of growing arrays.

Memory allocation statistics after compilation: (buckets 8..524288)
   13080 free:    13   109    39     2    13   2   3     2   2 0 0 0 0 0 0 0 0
 4933288 used:   211   251   519   184    35   6   5  3226   3 0 1 0 0 0 0 0 3
Total sbrk():  4960256. Odd ends: sbrk():       0, malloc():    1408 bytes.
Memory allocation statistics after execution:   (buckets 8..1048576)
   11704 free:    13   109    38     1    13   1   3     1   2 0 0 0 0 0 0 0 0 0
 9796616 used:   211   251   520   185    35   7   5  6439   3 0 1 0 0 0 0 0 4 1
Total sbrk():  9830400. Odd ends: sbrk():       0, malloc():    1408 bytes.

> It is 100 bytes per element. Since an integer array takes 24 bytes per
> element here, and there are only 3 arrays around (precalculated
> 1..100000, @a and @b), there is some other leak.
>
> Apparently <=> converts arguments to NV.

No, all this is wrong. It is 20bytes/elt, and we have stack,
mortals-stack, 1..100000, @a and @b.

Everything is OK now, including <=>.

Enjoy,

p5p-msgid: <199701210305.WAA05451@monk.mps.ohio-state.edu>
---

diff --git a/pp_hot.c b/pp_hot.c
index cbc2b95..cbc19d5 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -612,6 +612,7 @@ PP(pp_aassign)
 	    magic = SvMAGICAL(ary) != 0;
 	    
 	    av_clear(ary);
+	    av_extend(ary, lastrelem - relem);
 	    i = 0;
 	    while (relem <= lastrelem) {	/* gobble up all the rest */
 		sv = NEWSV(28,0);