Crud, I forgot to attach the quicksort in the last one...

Brian


On Sat, 2002-05-25 at 21:17, brian wheeler wrote:
> On Fri, 2002-05-24 at 15:10, Sean O'Rourke wrote:
> > > I was starting with a very simple test to decide how to determine where the
> > > memory overuse was coming from,
> > 
> > I'm actually looking at this now as well, though with zip2.pasm instead of
> > quicksort.  What I've found is that because zip constructs the result with
> > incremental packing, and since the 3-argument pack is implemented through
> > string_concat, which allocates a new string every time, it chews through
> > vast quantities of memory.  At some point, these buffers (which are now
> > ~45k each) stop getting freed, and Parrot grows from < 10M to about 200M
> > before my laptop dies a horrible death.
> > 
> > Sort does things much differently, but I wouldn't be surprised if it's
> > hittng the same things-not-being-reclaimed bug as zip.
> > 
> > > ["interesting" sorting results]
> > > Am I missing something somewhere?
> > 
> > You've probably got it in EBCDIC mode or something.  That or it's a
> > "randomized" quicksort, which is supposed to be faster.
> > 
> > /s
> 
> Actually I was getting the wrong results because I was using ge & le to
> test the bounds when I should have used gt & lt.
> 
> The attached quicksort fixes it.  Its still _huge_ when the memory runs.
> 
> 
> Looking at the profile data, it looks like Parrot_pushs is the big time
> user...
>   %   cumulative   self              self     total           
>  time   seconds   seconds    calls  ns/call  ns/call  name    
>  66.67      0.02     0.02                             singlebyte_decode
>  33.33      0.03     0.01      646 15479.88 15479.88  Parrot_pushs
> 
> 
> Of course, if I understood the calling convention, I might get away with
> less pushs's :)
> 
> Brian
> 
> 
> 
> 

#
# quicksort.pasm
#
# Author: Brian Wheeler ([EMAIL PROTECTED])
#
# Usage:
#    ./parrot quicksort.pbc < /file/to/quicksort
#               
main:
        new             P0,PerlArray
        set             I1,0
m1:     readline        S0,0
        length          I0,S0
        eq              I0,0,m2
        chopn           S0,1
        set_keyed       P0,I1,S0
        inc             I1
        branch          m1
        
m2:     set             I0,0
        set             I1,P0
        dec             I1
        bsr             quicksort
        
m3:     get_keyed       S0,P0,I0
        print           S0
        print           "\n"
        inc             I0
        le              I0,I1,m3
        
        end

#
# quicksort
#  params:
#               I0      low
#               I1      high
#               P0      array to sort
#  returns:
#               nothing
quicksort:
        pushi
        print           "Starting quicksort with "
        print           I0
        print           " and "
        print           I1
        print           "\n"
        set             I11,I1          # High=high; 
        set             I10,I0          # Low=low;
        le              I1,I0,q1        # if(high>low) {
        bsr             partition       #  pivot=partition(p,low,high);

        set             I0,I10          #  quicksort(p,Low,pivot-1)
        set             I1,I2
        dec             I1
        bsr             quicksort

        set             I0,I2           #  quicksort(p,pivot+1,High)
        inc             I0
        set             I1,I11
        bsr             quicksort 

q1:     popi                            # }
        ret


#
# partition
#  params:
#               I0      low
#               I1      high
#               P0      array to sort
#  returns:
#               I2      pivot
partition:
        pushi
        pushs
        get_keyed       S2,P0,I0        # S2 is pivot_item
        set             I2,I0           # I2 is pivot index
        set             I10,I0          # I10 is left
        set             I11,I1          # I11 is right
p1:     ge              I10,I11,p1e     # while(left < right) {
p2:     get_keyed       S0,P0,I10       #   while(p[left] <= pivot_item 
        gt              S0,S2,p2e
        gt              I10,I11,p2e     #      && left <= right) {
        inc             I10             #     left++; 
        branch          p2              #   }
p2e:    
p3:     get_keyed       S1,P0,I11       #   while(p[right] > pivot_item
        le              S1,S2,p3e
        lt              I11,I10,p3e     #       && right >= left) {
        dec             I11             #     right--; 
        branch          p3              #   }
p3e:
        ge              I10,I11,p4      #   if(left < right) {
        get_keyed       S3,P0,I10       #     swap(p,left,right); 
        get_keyed       S4,P0,I11
        set_keyed       P0,I11,S3
        set_keyed       P0,I10,S4
p4:                                     #   }
        branch          p1              # }
p1e:    get_keyed       S3,P0,I11       # p[low]=p[right]; 
        set_keyed       P0,I0,S3
        set_keyed       P0,I11,S2       # p[right]=pivot_item; 
        save            I11
        pops
        popi
        restore         I2              # return right;
        ret

Reply via email to