Some additional timings on my machine and comparison to MIcroJ

In J:

fib3=. ({: @:(({: , +/)@:]^:(2-~[))&1 1x)  NB. For y >: 3!


   6!:2 'fib3 475000'

60.7922


NB. fib test

fibtest =: 3 : 0

  x1 =. 1x

  x2 =. 1x

  c =. 0

  while. c < (y-2) do.

    tmp =.  x1

    x1 =. x2

    x2 =. tmp + x1

    c=.c+1

  end.

  x2

)

   6!:2 'fibtest 475000'

61.5696



NB. test does it speed things up if the c and while check are eliminated:


NB. fib test

fibtest2 =: 3 : 0

  x1 =. 1x

  x2 =. 1x

  for_c. i. (y-2) do.

    tmp =. x1

    x1 =. x2

    x2 =. tmp + x1

  end.

x2

)


   6!:2 'fibtest2 475000'

55.7621




In MicroJ:

I added basic BigInteger support[1].


NB. fib test
fibtest =: 3 : 0
  x1 =. (3!:101) 1 NB. convert to bignum
  x2 =. (3!:101) 1
  c =. 0
  while. c < (y-2) do.
    tmp =.  x1
    x1 =. x2
    x2 =. tmp + x1
    c=.c+1
  end.
  x2
)

    6!:2 'fibtest 475000'
46.2624291

NB. fib with for.
fibtestx =: 3 : 0
  x1 =. (3!:101) 1 NB. convert to bignum
  x2 =. (3!:101) 1
  for_c. i. (y-2) do.
    tmp =.  x1
    x1 =. x2
    x2 =. tmp + x1
  end.
  x2

    6!:2 'fibtestx 475000'
26.0208426


So in my implementation of MicroJ, it is nearly a factor 2 to use a for
instead of a while since the check and increment can be eliminated[2]

That got me thinking, a for loop would be a perfect candidate for a hotspot
JIT. As a proof of concept, I replaced my c# code with this:

names["tmp"] = names["x1"];
names["x1"] = names["x2"];
names["x2"] = math((A<BigInteger>)names["tmp"], (A<BigInteger>)names["x1"],
(a, b) => a + b);

    6!:2 'fibtestx 475000'
8.2506247

So the best I can do with C# at present looks to be about 8.25 seconds

Ideally that code would be generated automatically by the interpreter and
just in time compiled. Here's a crude implementation[3], [4] and resulting
performance:

    6!:2 'fibtestx 475000'
8.4406424

It's effectively the same speed as  f7a on my machine in jconsole (untested
on MicroJ as those primitives are not yet implemented)

  6!:2 'f7a 475000'

8.69614




1 -
https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx

2 - https://github.com/joebo/microj/blob/master/primitives.cs#L1307

3 - https://github.com/joebo/microj/blob/master/primitives.cs#L1299

4 - https://github.com/joebo/microj/blob/master/primitives.cs#L1209



On Wed, Sep 2, 2015 at 3:11 PM, Murray Eisenberg <mur...@math.umass.edu>
wrote:

> J does seem very awfully slow in executing, e.g., fib3 475000. On my iMac,
> that gives a timing of over 38 seconds.
>
> By contrast -- and to the extent that the timers involved can reasonably
> be compared -- on the same system, running the Wolfram Language looping
> definition
>
>     fib[n_] := Module[{fi = 1, fi1 = 0}, Do[{fi, fi1} = {fi + fi1, fi}, {n
> - 1}]; fi]
>
> in Mathematica 10.2 gives execution speed of just over 1.08 seconds for
> fib[475000].
> (And the built-in function Fibonacci executes for argument 475000 at the
> astonishing speed of 0.0021 seconds!)
> Although the internals of Mathematica are proprietary, the docs say that
> high-precision arithmetic is implemented by means of GMP.
>
>
> > On 2 Sep 2015 14:03:24 -040, Jose Mario Quintana <
> jose.mario.quint...@gmail.com> wrote:
> >
> >
> > Actually, the tacit version seems to be faster for relatively small
> > arguments.  First allow me to rewrite fib1
> >
> > fib2 and your expression as verbs working with extended precision and
> > producing the yth Fibonacci number:
> >
> > fib1 =:1x"_`(($:@:<:) + ($:@:-&2))@.(2&<)M.
> >
> > fib2 =: 3 : 0
> >  x1 =. x:1
> >  x2 =. x:1
> >  c =. 0
> >  while. c < (y-2) do.
> >    tmp =.  x1
> >    x1 =. x2
> >    x2 =. tmp + x1
> >    c=.c+1
> >  end.
> >  x2
> > )
> >
> > fib3=. ({: @:(({: , +/)@:]^:(2-~[))&1 1x)  NB. For y >: 3!
> >
> > Checking,
> >
> >   (fib1"0 ; fib2"0 ; fib3"0) 3 4 5 6 7
> > ??????????????????????????????????
> > ?2 3 5 8 13?2 3 5 8 13?2 3 5 8 13?
> > ??????????????????????????????????
> >
> >   (fib1 , fib2 , fib3) 111
> > 70492524767089125814114 70492524767089125814114 70492524767089125814114
> >
> > Comparing their performance,
> >
> >   st=. (, */&.:>@:(1 2&{))@:(] ; 7!:2@:] ; 6!:2)
> >
> >
> >   st&> 'fib1 5555';'fib2 5555';'fib3 5555'
> > ?????????????????????????????????????????
> > ?fib1 5555?1664 ?0.0823093021?136.962679?
> > ?????????????????????????????????????????
> > ?fib2 5555?24704?0.0457517422?1130.25104?
> > ?????????????????????????????????????????
> > ?fib3 5555?23168?0.0209733696?485.911027?
> > ?????????????????????????????????????????
> >
> > For large arguments, as Groeneveld pointed out, the performance is
> > dominated by the extended precision
> >
> > calculations (at least for this method),
> >
> >  st&> 'fib2  475000';'fib3  475000'
> > ????????????????????????????????????????????
> > ?fib2  475000?1315200?43.1150201?56704874.5?
> > ????????????????????????????????????????????
> > ?fib3  475000?1313664?44.0851651?57913094.4?
> > ????????????????????????????????????????????
> ....
>
> ——
> Murray Eisenberg                                mur...@math.umass.edu
> Mathematics & Statistics Dept.
> Lederle Graduate Research Tower      phone 240 246-7240 (H)
> University of Massachusetts
> 710 North Pleasant Street
> Amherst, MA 01003-9305
>
>
>
>
>
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to