I was investigating the slowness of this and identified a call to gc3 as
being the culprit
With the gc3:
f1 =: 3 : '(>: each)^:(<y) (<0)'
(6!:2) 'f1 100000'
33.0624
Without it
(6!:2) 'f1 100000'
0.272726
It still works:
f1 5
+-+-+-+-+-+
|0|1|2|3|4|
+-+-+-+-+-+
Why is it doing this operation (garbage collection?) every 10 loops
https://github.com/jsoftware/jsource/blob/e68277f408433fe34fd31f0161a31c96d9ccb44e/jsrc/cp.c#L97
Can anyone elaborate on this? Is the 10 count too frequent?
Repeatedly running f1 100000 does not result in a memory leak as far as I
can tell.
cp.c
static DF1(jtply1){PROLOG(0040);DECLFG;A b,hs,j,x,*xv,y,z;B*bv,q;I
i,k,m,n,*nv,old,p=0;
hs=sv->h; m=AN(hs);
RZ(x=ravel(hs)); RZ(y=from(j=grade1(x),x)); nv=AV(y);
GATV(x,BOX,m,1,0); xv=AAV(x);
while(p<m&&0>nv[p])p++;
if(p<m){
RZ(z=ca(w));
n=nv[m-1]; k=p;
while(k<m&&!nv[k]){xv[k]=z; ++k;}
RZ(b=eq(ainf,from(j,ravel(gs)))); bv=BAV(b); q=k<m?bv[k]:0;
old=jt->tnextpushx;
for(i=1;i<=n;++i){
RZ(z=CALL1(f1,y=z,fs));
if(q&&equ(y,z)){DO(m-k, xv[k]=z; ++k;); break;}
while(k<m&&i==nv[k]){xv[k]=z; ++k; q=k<m?bv[k]:0;}
if(!(i%10))gc3(x,z,0L,old);
}}
if(0<p){
RZ(fs=inv(fs)); f1=VAV(fs)->f1;
RZ(z=ca(w));
n=nv[0]; k=p-1;
RZ(b=eq(scf(-inf),from(j,ravel(gs)))); bv=BAV(b); q=bv[k];
old=jt->tnextpushx;
for(i=-1;i>=n;--i){
RZ(z=CALL1(f1,y=z,fs));
if(q&&equ(y,z)){DO(1+k, xv[k]=z; --k;); break;}
while(0<=k&&i==nv[k]){xv[k]=z; --k; q=0<=k?bv[k]:0;}
# ----------------> if(!(i%10))gc3(x,z,0L,old);
}}
z=ope(reshape(shape(hs),from(grade1(j),x))); EPILOG(z);
}
void jtgc3(J jt,A x,A y,A z,I old){
if(x)ra(x); if(y)ra(y); if(z)ra(z);
tpop(old);
if(x)tpush(x); if(y)tpush(y); if(z)tpush(z);
}
---------- Forwarded message ----------
From: Joe Bogner <[email protected]>
Date: Tue, Jan 10, 2017 at 6:26 PM
Subject: Re: ^: slowness with boxes
To: [email protected]
For a little more color: previous discussion: http://www.
jsoftware.com/pipermail/programming/2014-March/035994.html
I'm going to switch back to using i. for this
On Tue, Jan 10, 2017 at 6:15 PM, Joe Bogner <[email protected]> wrote:
> Looks like it is due to the boxing. Please disregard
>
> http://code.jsoftware.com/wiki/Vocabulary/comma#dyadic mentions that
> append in place special code does not work for boxes
>
> f4 =: 3 : 0
>
> a=:a:
>
> for_n. (i. y) do. a=:a,(<n) end.
>
> )
>
>
> (6!:2) 'f4 100'
>
> 0.000336555
>
> (6!:2) 'f4 1000'
>
> 0.0149772
>
> (6!:2) 'f4 10000'
>
> 0.667025
>
> (6!:2) 'f4 20000'
>
> 2.69115
>
> (6!:2) 'f4 100000'
>
> 170.261
>
>
>
>
> On Tue, Jan 10, 2017 at 5:26 PM, Joe Bogner <[email protected]> wrote:
>
>> Why are these so different in execution speed? I'm surprised assembling
>> that linking boxes makes that much of a difference over an number. I need
>> it to be boxed because I'm going to something more complex with each
>> iteration.
>>
>> f1 =: 3 : '(>: each)^:(<y) (<0)'
>>
>> (6!:2) 'f1 100'
>> 6.01622e_5
>> (6!:2) 'f1 1000'
>> 0.0012719
>> (6!:2) 'f1 10000'
>> 0.145702
>> (6!:2) 'f1 100000'
>> 33.0624
>>
>> f2 =: 3 : '(>:)^:(<y) (0)'
>>
>> (6!:2) 'f2 100'
>> 4.24675e_5
>> (6!:2) 'f2 1000'
>> 0.000189688
>> (6!:2) 'f2 10000'
>> 0.00180487
>> (6!:2) 'f2 100000'
>> 0.0256836
>>
>>
>> I'm thinking of using ^: to execute something N times with an increasing
>> argument.
>>
>> I could use i. but wanted to try something different
>>
>>
>> JVERSION
>>
>> Engine: j805/j64/windows
>>
>> Release: commercial/2016-12-11T08:02:16
>>
>> Library: 8.05.11
>>
>> Qt IDE: 1.5.3s/5.6.2
>>
>> Platform: Win 64
>>
>> Installer: J805 install
>>
>> InstallPath: c:/program files/j64-805
>>
>> Contact: www.jsoftware.com
>>
>
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm