That is indeed blazingly fast.
,M0 , (< 0 0) was indeed on purpose. I'm adding a
temporary 0 cell to the end of the table that all the
terminal cells point to.
There was a bug with my original listing though. M0
line should be M=: ... not M=. ...
I'll have to study your code in depth, as I don't
fully get it just reading it. &. is not one of the
more obvious functions.
--- Henry Rich <[EMAIL PROTECTED]> wrote:
> When something is slow, it's usually because you
> are operating with too low a rank.
>
> Here, you are interpreting up82 6400 times,
> which is about 2/3 of the problem.
>
> Also, it's better to use &.> to do the boxing
> and unboxing, since that's optimized.
>
> The following runs fast (I'm on J6):
>
> ,. {&(,M0 , (< 0 0))&.> ,&.> ,m
>
> I had to ,&.> the m to get the same results as the
> original.
>
> I suspect ,M0 , (< 0 0) is not creating what you
> think.
>
> Henry Rich
>
> > -----Original Message-----
> > From: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED] On
> Behalf Of p j
> > Sent: Thursday, February 23, 2006 5:41 PM
> > To: [email protected]
> > Subject: [Jprogramming] Strange performance
> problem
> >
> > At the bottom of this message is timing code for
> what
> > I naively think should be the same function call.
> But
> > one is over 1000 times faster.
> >
> > The code (x up82 y) is called with x as a column
> of
> > boxes, where each box contains 1 to 3 indexes to
> look
> > up in y.
> > x up82"1 y returns the result without filling
> (what I
> > want), but is slow. IE if a box in x has only one
> > index, the function returns only one box in the
> result
> > instead of filling the result with 0{y.
> > x up82 y fills result with 0{y
> >
> > 1. I don't really understand the difference
> between
> > the 2 function calls, so thank you for any
> patience in
> > explaining the difference.
> > 2. I'm curious why one is 1400x times slower
> >
> > -------SETUP CODE
> >
> >
> > M =: i.80 80
> > m=: (1+i.(80*80)),(80+i.(80*80)),(_80+i.(80*80))
> > m=: 80 80 $(<"1 (>"1 (|: (3 6400 $ m))))
> > m=: (<"1 (}:"1 (>0{m))) 0}m
> > m=: (<"1 (0 2 {"1 (>_1{m))) _1}m
> > m=: (<"0 (1+ 80*i.80) ) (< a: ; 0) } m
> > m=: (<"0 (80$ 6400)) (< a: ; _1) } m NB. add
> trailing
> > 0 in 6401st position of input matrix
> > M0 =. 80 80 $ <"1 (,. , +/\."1 M),"1 (,.,M)
> >
> > up82 =: 4 : 0
> > <"1((> x.) { y.)
> > )
> >
> > ------------TIMING CODE
> > ts '(,. ,m) up82 ,M0 , (< 0 0)'
> > 0.0216966 994048
> > ts '(,. ,m) up82"1 ,M0 , (< 0 0)'
> > 27.8915 1.27974e6
> >
> >
> >
> >
> >
> >
> >
>
__________________________________________________________
>
> > Find your next car at http://autos.yahoo.ca
> >
>
----------------------------------------------------------------------
> > For information about J forums see
> > http://www.jsoftware.com/forums.htm
>
>
----------------------------------------------------------------------
> For information about J forums see
> http://www.jsoftware.com/forums.htm
>
__________________________________________________________
Find your next car at http://autos.yahoo.ca
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm