actualización¿Por qué el programa Clojure Hello World es tan lento en comparación con Java y Python?
Como sugerido por muchas personas, parece que esto era debido al hecho de que el código fue compilado clojure primero y luego ejecutado. La compilación AOT debería ayudar a compensar eso. Dado que el proceso práctico de compilación Clojure AOT me resultó un tanto difícil de resolver (cuestiones de classpath, cuestiones de directorio, etc.), escribí un pequeño proceso paso a paso here, en caso de que alguien estuviera interesado.
Hola a todos,
estoy leyendo "Programación Clojure" y yo estaba comparando algunos idiomas que uso desde hace algún código simple. Noté que las implementaciones de clojure fueron las más lentas en cada caso. Por ejemplo,
Python - hello.py
def hello_world(name):
print "Hello, %s" % name
hello_world("world")
y el resultado,
$ time python hello.py
Hello, world
real 0m0.027s
user 0m0.013s
sys 0m0.014s
Java - hello.java
import java.io.*;
public class hello {
public static void hello_world(String name) {
System.out.println("Hello, " + name);
}
public static void main(String[] args) {
hello_world("world");
}
}
y el resultado,
$ time java hello
Hello, world
real 0m0.324s
user 0m0.296s
sys 0m0.065s
y, finalmente,
Clojure - hellofun.clj
(defn hello-world [username]
(println (format "Hello, %s" username)))
(hello-world "world")
y resultados,
$ time clj hellofun.clj
Hello, world
real 0m1.418s
user 0m1.649s
sys 0m0.154s
eso es un conjunto, garangutan 1,4 segundos!
¿Alguien tiene indicaciones sobre la causa de esto? ¿Clojure realmente es tan lento o hay trucos de JVM y otros que se deben usar para acelerar la ejecución?
Más importante aún: ¿no será esta gran diferencia en el rendimiento un problema en algún momento? (Quiero decir, digamos que estaba usando Clojure para un sistema de producción; la ganancia que obtengo al utilizar lisp parece completamente contrarrestada por los problemas de rendimiento que puedo ver aquí).
La máquina que se utiliza aquí es un MacBook Pro con Snow Leopard 2007, un 2,16 GHz Intel C2D y 2G DDR2 SDRAM.
Por cierto, el guión CLJ que estoy usando es de here y se ve como,
#!/bin/bash
JAVA=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java
CLJ_DIR=/opt/jars
CLOJURE=$CLJ_DIR/clojure.jar
CONTRIB=$CLJ_DIR/clojure-contrib.jar
JLINE=$CLJ_DIR/jline-0.9.94.jar
CP=$PWD:$CLOJURE:$JLINE:$CONTRIB
# Add extra jars as specified by `.clojure` file
if [ -f .clojure ]
then
CP=$CP:`cat .clojure`
fi
if [ -z "$1" ]; then
$JAVA -server -cp $CP \
jline.ConsoleRunner clojure.lang.Repl
else
scriptname=$1
$JAVA -server -cp $CP clojure.main $scriptname -- $*
fi
Cada vez que ejecuta el ejemplo Clojure, se compila. Si desea medir el rendimiento de ejecución, AOT compila. – fogus
Existe una muy buena razón por la que no todos son lo suficientemente valientes como para comparar el código. No es fácil. No puedes simplemente ejecutar RUN y mirar un cronómetro. – Rayne
@fogus - gracias, estoy buscando compilación AOT. @Rayne - No estoy "evaluando" el código en un sentido literal. Quería una explicación de por qué funcionaba lento en comparación con otros lenguajes, y la explicación de compilación a pedido frente a AOT me ayudó a entender eso. – viksit