Comparación de 3 implementaciones de Common Lisp (Clisp, GCL y SBCL) mediante la función de Takeuchi
En artículos anteriores comentamos la función de Takeuchi como prueba de rendimiento y la usamos para la comparación del rendimiento de Haskell, Maxima y Common Lisp.
En este artículo voy a usar una variación de la prueba anterior para comparar tres implementaciones de Common Lisp: Clisp, GCL (GNU Common Lisp) y SBCL (Steel Bank Common Lisp).
La función de Takeuchi es
La prueba consistirá en comparar los tiempos empleados en calcular tak(n,0,n+1) para n entre 10 y 15.
El fichero con las definiciones Lisp utilizado es
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#+excl (eval-when (compile) (setq comp::register-use-threshold 6)) (defun tak (x y z) (declare (fixnum x y z)) (if (<= x y) y (tak (tak (- x 1) y z) (tak (- y 1) z x) (tak (- z 1) x y)))) (defun takeuchi (n) (tak n 0 (1+ n))) |
Todo los cálculos se han realizado en un ordenador con Ubuntu versión 10.04, núcleo linux 2.6.32-24-generic, 2,0 GiB de memoria y un procesador Intel(R) Atom(TM) CPU N280 @ 1.66GHz.
Los resultados se resumen en la siguiente tabla donde la primera columna se indica el valor de n y en las restantes los segundos empleados en el cálculo de takeuchi(n).
En la última columna he escrito los tiempos empleados por GHC (The Glasgow Haskell Compiler) en calcular (takeuchi n) usando la siguiente definición
1 2 3 4 5 6 7 8 9 |
tak :: Int -> Int -> Int -> Int tak x y z | x <= y = y | otherwise = tak (tak (x-1) y z) (tak (y-1) z x) (tak (z-1) x y) takeuchi :: Int -> Int takeuchi n = tak n 0 (n+1) |
Del experimento se concluye que SBCL se comporta mucho mejor que Clisp y GCL, aunque no tanto como GHC.