Cập nhậtTại sao chương trình Hello World của Clojure quá chậm so với Java và Python?
Theo đề xuất của nhiều người, có vẻ như điều này là do mã clojure được biên dịch lần đầu và sau đó được thực thi. Biên dịch AOT sẽ giúp bù đắp điều đó. Do tôi đã tìm thấy quy trình biên dịch Clojure AOT thực tế một chút khó giải quyết (các vấn đề về classpath, các vấn đề về thư mục và cộng sự), tôi đã viết một bước nhỏ theo từng bước here, trong trường hợp ai đó quan tâm.
Hi all,
tôi đang đọc "Lập trình Clojure" và tôi đã so sánh một số ngôn ngữ tôi sử dụng cho một số mã đơn giản. Tôi nhận thấy rằng việc triển khai clojure là chậm nhất trong mỗi trường hợp. Ví dụ,
Python - hello.py
def hello_world(name):
print "Hello, %s" % name
hello_world("world")
và kết quả,
$ 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");
}
}
và kết quả,
$ time java hello
Hello, world
real 0m0.324s
user 0m0.296s
sys 0m0.065s
và cuối cùng,
Clojure - hellofun.clj
(defn hello-world [username]
(println (format "Hello, %s" username)))
(hello-world "world")
và kết quả,
$ time clj hellofun.clj
Hello, world
real 0m1.418s
user 0m1.649s
sys 0m0.154s
Thats một toàn thể, garangutan 1,4 giây!
Có ai có gợi ý về nguyên nhân của việc này có thể là gì không? Clojure có thực sự chậm, hay có thủ thuật JVM và những thứ khác cần phải được sử dụng để tăng tốc độ thực thi?
Quan trọng hơn - không phải sự khác biệt lớn về hiệu suất sẽ là một vấn đề tại một thời điểm nào đó? (Tôi có nghĩa là, cho phép nói rằng tôi đã sử dụng Clojure cho một hệ thống sản xuất - đạt được tôi nhận được trong sử dụng lisp dường như hoàn toàn bù đắp bởi các vấn đề hiệu suất tôi có thể thấy ở đây).
Máy được sử dụng ở đây là Macbook Pro 2007 chạy Snow Leopard, 2.16Ghz Intel C2D và 2G DDR2 SDRAM.
BTW, kịch bản CLJ Tôi đang sử dụng là từ here và trông giống như,
#!/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
Mỗi lần bạn chạy ví dụ Clojure nó được biên dịch. Nếu bạn muốn đo hiệu suất chạy thì AOT sẽ biên dịch nó. – fogus
Có một lý do rất tốt mà không phải ai cũng đủ can đảm để chuẩn mã. Nó không phải là dễ dàng. Bạn không thể chỉ cần nhấn RUN và xem đồng hồ bấm giờ. – Rayne
@fogus - cảm ơn, tôi đang tìm kiếm trình biên dịch AOT. @Rayne - Tôi không "chấm điểm" mã theo bất kỳ nghĩa đen nào. Tôi muốn giải thích lý do tại sao nó chạy chậm so với các ngôn ngữ khác, và biên dịch theo yêu cầu so với lời giải thích của AOT đã giúp tôi hiểu điều đó! – viksit