La función de Takeuchi como banco de prueba para la eficiencia

La función de Takeuchi está definida por
tak(x,y,z) = \newline     \left\{     \begin{array}{ll}       y, & si \ x \leq y \\       tak(tak(x-1,y,z),           tak(y-1,z,x),           tak(z-1,x,y)) & en\ caso\ contrario     \end{array}     \right.

En este artículo voy a comparar la la eficiencia de Haskell, Maxima y Lisp escribiendo en los tres la definición recursiva de la función de Takeuchi y calculando tak(16,6,1).

La definición en Haskell es

y el cálculo es

La definición en Maxima es

y es el cálculo es

La definición en Lisp es

y el cálculo es

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.

El resumen de los tiempos obtenidos es
\begin{array}{|l|l|r|} \hline   Lenguaje              & Version          & Segundos\\ \hline   Haskell                 & GHC\ 6.12.1   &      0.02 \\ \hline   Lisp                     & CLISP\ 2.44.1 & 6204.17 \\ \hline   Lisp\ compilado      & CLISP\ 2.44.1 & 1006.67 \\ \hline   Maxima\ compilado & 5.20.1           & 5908.47 \\ \hline  \end{array}

Los tiempos anteriores depende de la versión del lenguaje y de la máquina que se esté usando. Por ejemplo, si en lugar de usar Clisp sobre Ubuntu usamos LispWorksPersonal Edition 5.1.1 en una máquina con Windows XP, Intel (R) Atom (TM) CPU N270 @ 1.60 GHz y 1.99 GB de RAM después de compilar el fichero el resultado es

El tiempo total es de 169.92 segundos, que es sensiblemente inferior a los 1006.67 segundos de Clisp.

¿Qué opináis de estas diferencias de tiempo?