in reply to Re^3: fibonacci numbers using subroutine?
in thread fibonacci numbers using subroutine?

You don't need to Memoize fib_memo(), the memoisation is already built in! That's what the state variable %memo is for.

Once you remove that, the real performace shows up (This is for (1..100)):

c:\test>junk21 Benchmark: timing 10000 iterations of Memo, Normal... Memo: 1 wallclock secs ( 0.64 usr + 0.00 sys = 0.64 CPU) @ 15 +649.45/s (n=10000) Normal: 15 wallclock secs (14.98 usr + 0.01 sys = 14.99 CPU) @ 66 +7.07/s (n=10000)

The difference is all the clearer with my preferred cmpthese() (why do you use timethese()?):

c:\test>junk21 Rate Normal Memo Normal 669/s -- -96% Memo 15573/s 2229% --

Replies are listed 'Best First'.
Re^5: fibonacci numbers using subroutine?
by Marshall (Canon) on Aug 20, 2010 at 13:06 UTC
    timethese() got used instead of cmpthese() because I just cut-n-pasted into some other boiler plate that I had. I also like the cmpthese() format better.

    I guess you must have a 64bit processor? I can't represent fib(100) as an int without resorting to some bigger than normal integer strategy.

      2**68 < Fib(100) == 354224848179261915075 < 2**69

      I do have 64-bit ints, but that shouldn't stop you from doing fib(100). It just rolls over to using floats (with loss of accuracy obviously). You should be able to go all the way to 1476:

      1 : 1 2 : 1 3 : 2 4 : 3 5 : 5 6 : 8 7 : 13 98 : 135301852344706760000 99 : 218922995834555200000 100 : 354224848179262000000 ... 1476 : 1306989223763398700000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000 1477 : 1