I'm new to Ruby BECAUSE of MacRuby While learning I run this simple exercise (the sum of even fibonacci less than 4 million) on both MacRuby 0.5.2 and ruby 1.9.1. the recursive version runs about 5 times faster on MacRuby and that was expected but the iterative runs about 1000!!! times slower, and that is *frankly* unacceptable. What's going on? uliano def fib_rec(n) n < 2 ? n : fib_rec(n-1) + fib_rec(n-2) end def fib_iter(limit) yield 0 yield 1 lastbut=0 last=1 while true a=lastbut+last if a<=limit yield a else return end lastbut=last last=a end end sum=0 i=0 start=Time.now while (f=fib_rec(i))<=4_000_000 sum += f if f%2==0 i+=1 end time=Time.now-start puts 'recursive' puts 'sum = ',sum puts 'time = ',time sum=0 start=Time.now fib_iter(4_000_000) { |f| sum+=f if f%2==0} time=Time.now-start puts 'iterative' puts 'sum = ',sum puts 'time = ',time
While learning I run this simple exercise (the sum of even fibonacci less than 4 million) on both MacRuby 0.5.2 and ruby 1.9.1.
the recursive version runs about 5 times faster on MacRuby and that was expected but the iterative runs about 1000!!! times slower, and that is *frankly* unacceptable.
What's going on?
The main reason is the compilation time for both the fib_iter function and the block you pass to it. In the default JIT mode, MacRuby compiles them the first time they are called. If you compile your code with macrubyc, there is much less difference between 1.9 and MacRuby in your iterative version.
On Sun, Nov 22, 2009 at 1:25 AM, Uliano Guerrini <uliano.guerrini@gmail.com>wrote:
I'm new to Ruby BECAUSE of MacRuby
While learning I run this simple exercise (the sum of even fibonacci less than 4 million) on both MacRuby 0.5.2 and ruby 1.9.1.
the recursive version runs about 5 times faster on MacRuby and that was expected but the iterative runs about 1000!!! times slower, and that is *frankly* unacceptable.
What's going on?
uliano
def fib_rec(n) n < 2 ? n : fib_rec(n-1) + fib_rec(n-2) end
def fib_iter(limit) yield 0 yield 1 lastbut=0 last=1 while true a=lastbut+last if a<=limit yield a else return end lastbut=last last=a end end
sum=0 i=0 start=Time.now while (f=fib_rec(i))<=4_000_000 sum += f if f%2==0 i+=1 end time=Time.now-start
puts 'recursive' puts 'sum = ',sum puts 'time = ',time
sum=0 start=Time.now fib_iter(4_000_000) { |f| sum+=f if f%2==0} time=Time.now-start
puts 'iterative' puts 'sum = ',sum puts 'time = ',time
Uliano, what were you actual benchmarks and your system configuration? -Conrad _______________________________________________
MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
Hi Uliano, Thanks for trying MacRuby. Vincent is right. Your second test is actually running too fast (0.008167 seconds here) that most of the time is spent JIT compiling the block. Try to loop 10 times around the test and you should see that further calls are faster than Ruby 1.9.1. Or try to increase the test value. I don't believe this is unacceptable. JIT compilation is slow but here 0.008167 seconds are fast enough. Laurent On Nov 22, 2009, at 1:25 AM, Uliano Guerrini wrote:
I'm new to Ruby BECAUSE of MacRuby
While learning I run this simple exercise (the sum of even fibonacci less than 4 million) on both MacRuby 0.5.2 and ruby 1.9.1.
the recursive version runs about 5 times faster on MacRuby and that was expected but the iterative runs about 1000!!! times slower, and that is *frankly* unacceptable.
What's going on?
uliano
def fib_rec(n) n < 2 ? n : fib_rec(n-1) + fib_rec(n-2) end
def fib_iter(limit) yield 0 yield 1 lastbut=0 last=1 while true a=lastbut+last if a<=limit yield a else return end lastbut=last last=a end end
sum=0 i=0 start=Time.now while (f=fib_rec(i))<=4_000_000 sum += f if f%2==0 i+=1 end time=Time.now-start
puts 'recursive' puts 'sum = ',sum puts 'time = ',time
sum=0 start=Time.now fib_iter(4_000_000) { |f| sum+=f if f%2==0} time=Time.now-start
puts 'iterative' puts 'sum = ',sum puts 'time = ',time
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
To be significant, your test should have a higher reference value. - Matt On Sun, Nov 22, 2009 at 5:30 PM, Laurent Sansonetti <lsansonetti@apple.com>wrote:
Hi Uliano,
Thanks for trying MacRuby.
Vincent is right. Your second test is actually running too fast (0.008167 seconds here) that most of the time is spent JIT compiling the block. Try to loop 10 times around the test and you should see that further calls are faster than Ruby 1.9.1. Or try to increase the test value.
I don't believe this is unacceptable. JIT compilation is slow but here 0.008167 seconds are fast enough.
Laurent
On Nov 22, 2009, at 1:25 AM, Uliano Guerrini wrote:
I'm new to Ruby BECAUSE of MacRuby
While learning I run this simple exercise (the sum of even fibonacci less than 4 million) on both MacRuby 0.5.2 and ruby 1.9.1.
the recursive version runs about 5 times faster on MacRuby and that was expected but the iterative runs about 1000!!! times slower, and that is *frankly* unacceptable.
What's going on?
uliano
def fib_rec(n) n < 2 ? n : fib_rec(n-1) + fib_rec(n-2) end
def fib_iter(limit) yield 0 yield 1 lastbut=0 last=1 while true a=lastbut+last if a<=limit yield a else return end lastbut=last last=a end end
sum=0 i=0 start=Time.now while (f=fib_rec(i))<=4_000_000 sum += f if f%2==0 i+=1 end time=Time.now-start
puts 'recursive' puts 'sum = ',sum puts 'time = ',time
sum=0 start=Time.now fib_iter(4_000_000) { |f| sum+=f if f%2==0} time=Time.now-start
puts 'iterative' puts 'sum = ',sum puts 'time = ',time
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
_______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel
participants (5)
-
Conrad Taylor
-
Laurent Sansonetti
-
Matt Aimonetti
-
Uliano Guerrini
-
Vincent Isambart