Trong khi đo điểm chuẩn cho ứng dụng Clojure và cố gắng khắc phục các vấn đề về hiệu năng, tôi nhận thấy hành vi đặc biệt này: ngay cả khi toàn bộ chương trình được viết bằng Java, khi khởi chạy từ Leiningen, nó dường như bị chậm lại đáng kể.Tại sao bất kỳ chương trình Java/Clojure nào bị chậm lại khi chạy từ Leiningen?
Nói rằng tôi có chương trình này Java:
public class Foo {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++)
run();
}
public static void run() {
final long start = System.nanoTime();
Random r = new Random();
double x = 0;
for(int i=0; i<50000000; i++)
x += r.nextDouble();
final long time = TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS);
System.out.println("time (ms): " + time + " total: " + x);
}
}
Khi tôi chỉ cần chạy chương trình, tôi có được thời gian thực hiện (mỗi run
) khoảng 1s. Tuy nhiên, khi tôi chạy nó từ leiningen như vậy: lần
lein run -m Foo
tôi nhận được chạy khoảng 2s! Làm thế nào để Clojure/Leiningen quản lý để làm chậm một chương trình Java hoàn chỉnh bởi rất nhiều? Tôi đang làm gì sai?
Tôi đã thử kiểm tra các thuộc tính hệ thống trong cả hai lần chạy và không thể tìm thấy bất kỳ thứ gì rõ ràng (như các cài đặt JIT khác nhau). Trong cả hai trường hợp, tôi sử dụng Java 7 với trình biên dịch máy chủ.
CHỈNH SỬA: Tôi không biết tại sao câu hỏi này đã được giảm giá. Tôi không chống lại Clojure. Ngược lại, tôi yêu Clojure và tôi sẽ sử dụng nó. Tôi chỉ có vấn đề hiệu suất nghiêm trọng mà tôi hoàn toàn phải giải quyết.
CẬP NHẬT: Chạy lein trampoline
giải quyết vấn đề! (mặc dù tôi không biết tại sao) Tôi đã cập nhật câu hỏi để phản ánh rằng đây thực sự là vấn đề của Leiningen chứ không phải vấn đề về Clojure.
Cập nhật khác: Điều này cũng xảy ra với bất kỳ mã Clojure nào. Chạy mà không trampoline làm chậm mã xuống đến 5x.
Mẹo: 'Lein giúp đỡ trampoline' – noahlz