Обновление
Как полагают многие, похоже, что это произошло из-за того, что код clojure был сначала скомпилирован, а затем выполнен.Компиляция AOT должна помочь компенсировать это.Учитывая, что практический процесс компиляции Clojure AOT оказался немного сложным (проблемы с classpath, проблемы с каталогами и т. Д.), Я написал небольшой пошаговый процесс здесь на случай, если кому-то будет интересно.
Привет всем,
Я читаю "Программирование Clojure", и я сравнивал некоторые языки, которые я использую для некоторого простого кода.Я заметил, что реализации clojure были самыми медленными в каждом случае.Например,
Python - hello.py
def hello_world(name):
print "Hello, %s" % name
hello_world("world")
и результат,
$ 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");
}
}
и результат,
$ time java hello
Hello, world
real 0m0.324s
user 0m0.296s
sys 0m0.065s
и, наконец,
Clojure - hellofun.clj
(defn hello-world [username]
(println (format "Hello, %s" username)))
(hello-world "world")
и результаты,
$ time clj hellofun.clj
Hello, world
real 0m1.418s
user 0m1.649s
sys 0m0.154s
Вот и все, гарангутан 1,4 секунды!
У кого-нибудь есть указатели на то, что может быть причиной этого?Действительно ли Clojure такой медленный, или есть уловки JVM и др., Которые необходимо использовать для ускорения выполнения?
Что еще более важно - не станет ли эта огромная разница в производительности проблемой в какой-то момент??(Я имею в виду, скажем, я использовал Clojure для производственной системы - выигрыш от использования lisp, похоже, полностью компенсируется проблемами с производительностью, которые я вижу здесь).
Используемая здесь машина - Macbook Pro 2007 года, работающий под управлением Snow Leopard, 2,16 ГГц Intel C2D и 2G DDR2 SDRAM.
Кстати, используемый мной сценарий clj здесь и выглядит как
#!/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