lunes, 1 de febrero de 2010

Victoria de Ruby resolviendo Fibonacci (vs Python)

Conversando rápidamente con un 'amix' en twitter (@Yaraher - Alvaro Pereyra) me dí con la sorpresa de que el rendimiento de Ruby se ha incrementado dramáticamente, así que lo sometí a una sencilla prueba comparándolo con Python: la archi conocida secuencia fibonacci.

El vídeo muestra una ventana de Terminator, dividida en 2 áreas horizontales y 4 verticales.  En la primera sección vertical se ejecuta la secuencia fibonacci empleando Python2.6, en la segunda con Python 3.1, en la tercera con Ruby 1.8 y en la cuarta con Ruby 1.9.1.





En primer lugar las tareas se ejecutan simultáneamente, luego se ejecuta cada una individualmente y así poder apreciar su rendimiento como proceso mandatorio.


Código Python

def fib(n):
 if n == 0 or n == 1:
         return n
 else:
  return fib(n-1) + fib(n-2)

for i in range(36):
 #print "n=%d => %d" % (i, fib(i))
 print ("n=",i," =>",fib(i))


Código Ruby

def fib(n)
 if n == 0 || n == 1
              n
 else
  fib(n-1) + fib(n-2)
 end
end

36.times do |i|
 puts "n=#{i} => #{fib(i)}"
end




El resultado de la prueba fue una victoria absoluta para Ruby 1.9.1 (con unos impresionantes 8.xx segundos, pero solamente cuando es el proceso principal que emplea el CPU, cuando no es así el rendimiento es similar al de Python), ambas versiones de Python van muy parejas sin mucho cambio en el rendimiento (19 y 21 segundos) y si están empleando 1.8, dejen de hacerlo: es malísimo (62 segundos)


2 comentarios:

  1. Salvo que todavía el soporte en gemas y demás bibliotecas para la 1.9.1 todavía no está en lo que debería. Pero definitivamente, la velocidad es ya no un problema :)

    ResponderEliminar
  2. La velocidad ya no es un problema gracias a este feedback por parte de Nobuyoshi Nakada.

    http://redmine.ruby-lang.org/issues/show/2277

    o me equivoco?

    ResponderEliminar