{"id":638,"date":"2010-09-16T07:11:54","date_gmt":"2010-09-16T07:11:54","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/comparacion-de-3-implementaciones-de-common-lisp-clisp-gcl-y-sbcl-mediante-la-funcion-de-takeuchi\/"},"modified":"2014-04-09T19:48:37","modified_gmt":"2014-04-09T17:48:37","slug":"comparacion-de-3-implementaciones-de-common-lisp-clisp-gcl-y-sbcl-mediante-la-funcion-de-takeuchi","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/comparacion-de-3-implementaciones-de-common-lisp-clisp-gcl-y-sbcl-mediante-la-funcion-de-takeuchi\/","title":{"rendered":"Comparaci\u00f3n de 3 implementaciones de Common Lisp (Clisp, GCL y SBCL) mediante la funci\u00f3n de Takeuchi"},"content":{"rendered":"<p>En art\u00edculos anteriores comentamos <a href=\"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/tak-como-prueba-de-rendimiento\/\">la funci\u00f3n de Takeuchi como prueba de rendimiento<\/a> y la usamos para la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/la-funcion-de-takeuchi-como-banco-de-prueba-para-la-eficiencia\/\">comparaci\u00f3n del rendimiento de Haskell, Maxima y Common Lisp<\/a>.<\/p>\n<p>\nEn este art\u00edculo voy a usar una variaci\u00f3n de la prueba anterior para comparar tres implementaciones de Common Lisp: <a href=\"http:\/\/clisp.cons.org\/\">Clisp<\/a>, <a href=\"http:\/\/www.gnu.org\/software\/gcl\/\">GCL (GNU Common Lisp)<\/a> y <a href=\"http:\/\/www.sbcl.org\/\">SBCL (Steel Bank Common Lisp)<\/a>.<\/p>\n<p>\nLa funci\u00f3n de Takeuchi es<br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=tak%28x%2Cy%2Cz%29+%3D+%5Cnewline+++++%5Cleft%5C%7B+++++%5Cbegin%7Barray%7D%7Bll%7D+++++++y%2C+%26+%5Cmathrm%7Bsi%7D+%5C+x+%5Cleq+y+%5C%5C+++++++%5Cmathrm%7Btak%7D%28%5Cmathrm%7Btak%7D%28x-1%2Cy%2Cz%29%2C++++++++++++++++++++%5Cmathrm%7Btak%7D%28y-1%2Cz%2Cx%29%2C++++++++++++++++++++%5Cmathrm%7Btak%7D%28z-1%2Cx%2Cy%29%29+%26+%5Cmathrm%7Ben%5C+caso%5C+contrario%7D+++++%5Cend%7Barray%7D+++++%5Cright.++&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"tak(x,y,z) = &#92;newline     &#92;left&#92;{     &#92;begin{array}{ll}       y, &amp; &#92;mathrm{si} &#92; x &#92;leq y &#92;&#92;       &#92;mathrm{tak}(&#92;mathrm{tak}(x-1,y,z),                    &#92;mathrm{tak}(y-1,z,x),                    &#92;mathrm{tak}(z-1,x,y)) &amp; &#92;mathrm{en&#92; caso&#92; contrario}     &#92;end{array}     &#92;right.  \" class=\"latex\" \/><\/p>\n<p>\nLa prueba consistir\u00e1 en comparar los tiempos empleados en calcular tak(n,0,n+1) para n entre 10 y 15.<br \/>\n<!--more--><\/p>\n<p>\nEl fichero con las definiciones Lisp utilizado es<\/p>\n<pre lang=\"Lisp\">\r\n#+excl\r\n(eval-when (compile) (setq comp::register-use-threshold 6))\r\n\r\n(defun tak (x y z)\r\n  (declare (fixnum x y z))\r\n  (if (<= x y)\r\n      y\r\n      (tak (tak (- x 1) y z)\r\n           (tak (- y 1) z x)\r\n           (tak (- z 1) x y))))\r\n\r\n(defun takeuchi (n) \r\n  (tak n 0 (1+ n)))\r\n<\/pre>\n<p>\nTodo los c\u00e1lculos se han realizado en un ordenador con Ubuntu versi\u00f3n 10.04, n\u00facleo linux 2.6.32-24-generic, 2,0 GiB de memoria y un procesador Intel(R) Atom(TM) CPU N280 @ 1.66GHz.<\/p>\n<p>\nLos 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\u00e1lculo de takeuchi(n).<br \/>\n<img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=%5Cbegin%7Barray%7D%7B%7Cl%7Cr%7Cr%7Cr%7Cr%7C%7D+%5Chline++n++%26+Clisp+++%26+GCL+++++%26+SBCL++++%26+GHC++%5C%5C+%5Chline++10+%26++++1.23+%26++++0.96+%26++++0.16+%26+0.00+%5C%5C+%5Chline++11+%26++++8.02+%26++++6.19+%26++++0.99+%26+0.00+%5C%5C+%5Chline++12+%26+++56.04+%26+++43.43+%26++++7.05+%26+0.00+%5C%5C+%5Chline++13+%26++418.62+%26++314.01+%26+++50.95+%26+0.00+%5C%5C+%5Chline++14+%26+3441.37+%26+2408.87+%26++502.51+%26+0.00+%5C%5C+%5Chline++15+%26+++++++++%26+++++++++%26+2300.01+%26+0.00+%5C%5C+%5Chline++%5Cend%7Barray%7D+++&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"&#92;begin{array}{|l|r|r|r|r|} &#92;hline  n  &amp; Clisp   &amp; GCL     &amp; SBCL    &amp; GHC  &#92;&#92; &#92;hline  10 &amp;    1.23 &amp;    0.96 &amp;    0.16 &amp; 0.00 &#92;&#92; &#92;hline  11 &amp;    8.02 &amp;    6.19 &amp;    0.99 &amp; 0.00 &#92;&#92; &#92;hline  12 &amp;   56.04 &amp;   43.43 &amp;    7.05 &amp; 0.00 &#92;&#92; &#92;hline  13 &amp;  418.62 &amp;  314.01 &amp;   50.95 &amp; 0.00 &#92;&#92; &#92;hline  14 &amp; 3441.37 &amp; 2408.87 &amp;  502.51 &amp; 0.00 &#92;&#92; &#92;hline  15 &amp;         &amp;         &amp; 2300.01 &amp; 0.00 &#92;&#92; &#92;hline  &#92;end{array}   \" class=\"latex\" \/><\/p>\n<p>\nEn la \u00faltima columna he escrito los tiempos empleados por <a href=\"http:\/\/www.haskell.org\/ghc\/\">GHC (The Glasgow Haskell Compiler)<\/a> en calcular (takeuchi n) usando la siguiente definici\u00f3n<\/p>\n<pre lang=\"Haskell\">\r\ntak :: Int -> Int -> Int -> Int\r\ntak x y z\r\n    | x <= y    = y\r\n    | otherwise = tak (tak (x-1) y z)\r\n                      (tak (y-1) z x)\r\n                      (tak (z-1) x y)\r\n\r\ntakeuchi :: Int -> Int\r\ntakeuchi n = tak n 0 (n+1)\r\n<\/pre>\n<p>\nDel experimento se concluye que SBCL se comporta mucho mejor que Clisp y GCL, aunque no tanto como GHC.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En art\u00edculos anteriores comentamos la funci\u00f3n de Takeuchi como prueba de rendimiento y la usamos para la comparaci\u00f3n del rendimiento de Haskell, Maxima y Common Lisp. En este art\u00edculo voy a usar una variaci\u00f3n de la prueba anterior para comparar tres implementaciones de Common Lisp: Clisp, GCL (GNU Common Lisp) y SBCL (Steel Bank Common&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[5,92,95],"tags":[270,283,284,94],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/638"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=638"}],"version-history":[{"count":11,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/638\/revisions"}],"predecessor-version":[{"id":4257,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/638\/revisions\/4257"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}