Dear All,

I've come across a puzzle
and would be glad if someone could explain it.

In a few words, I have a variation of collatzv which is a one-liner
 (c1 below) and the very same verb spread over several lines (c2 below).
The second is nearly twice as fast as the first.  How come?

The timings I get are

 collatzv T          0.0592513

 c1 T NB. one-liner  0.0582203

 c2 T NB. spread out 0.0352435

where T is  2 + i. 1e6

What follows is transcript of session producing these results.

Starting with Roger Hui's original collatzv:


   collatzv =: 3 : '<. (2|y)} 0 1 + 0.5 3 */y'

   NB. here is my one-liner, an experiment intended to stick to
   NB. integer arithmetic throughout.

   c1 =: 3 : '(_1 & (33 b.)) (2 | y) }  y ,: (2 + 6 * y)'

   NB. here is a spread-out version

   c2 =: 3 : 0
  a =. 2 | y
  b =. 2 + 6 * y
  c =. a } y ,: b
  (_1 & (33 b.)) c
)

   (collatzv -: c1) T =: 2 + i. 1e6
1
   (collatzv -: c2) T
1

   NB. comparing timings:

   compare =: (; (6!:2)) @: > "0
   compare 'collatzv T '; 'c1 T NB. one-liner '; 'c2 T NB. spread out'

 collatzv T          0.0587746

 c1 T NB. one-liner  0.0579726

 c2 T NB. spread out 0.0340378


   NB. Do we get the same effect by spreading collatzv?  No.

   collatzvs =: 3 : 0
  a =. 0 1 + 0.5 3 */y
  b =. 2|y
  c =: b } a
  <. c
)

   (collatzv -: collatzvs) T
1

   compare  'collatzv T '; 'c1 T '; 'c2 T '; 'collatzvs T '

 collatzv T   0.0591852

 c1 T         0.0594112

 c2 T         0.034516

 collatzvs T  0.0597546


   JVERSION
Engine: j701/2011-01-10/11:25
Library: 8.02.10
Qt IDE: 1.1.3/5.3.0
Platform: Win 64
Installer: J802 install
InstallPath: c:/users/homer/j64-802


----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to