2013-04-18 28 views
5

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.

+0

Mẹo: 'Lein giúp đỡ trampoline' – noahlz

Trả lời

-1

leiningen mất khoảng một giây để bắt đầu.

+0

Rõ ràng, tôi không kể thời gian khởi động Lein của. Nhìn vào chương trình. Tôi đang xem thời gian trong phương thức chạy. – pron

+0

Bạn nói đúng. Tôi đoán có cái gì đó kỳ lạ đang xảy ra ở đó. Bạn có chắc là bạn có những thứ tương tự trên classpath không? –

+0

Ngoài ra: bạn có thể có giới hạn bộ nhớ khác nhau, vì vậy chương trình bắt đầu lein có thể phải thực hiện thu gom rác nhiều hơn. Vấn đề khó chẩn đoán mà không có các cài đặt/thuộc tính hệ thống chính xác. –

1

Có thể do hành vi JIT khác nhau.

Việc thực hiện JIT biên soạn có thể bị ảnh hưởng bởi một số thứ, bao gồm:

  • mã khởi động gì được gọi, mà sẽ ảnh hưởng đến thống kê JIT
  • gì các lớp khác đã được nạp (ví dụ lớp con khác của Random) có thể ảnh hưởng đến tối ưu hóa của trình biên dịch của phương thức gửi cuộc gọi
+0

Tôi đã thử cả hai với -XX: + PrintCompilation. Trong cả hai trường hợp run() được biên dịch (chỉ có chức năng thú vị ở đây). Xem bản cập nhật, mặc dù. Bằng cách nào đó, đó là leiningen gây ra điều này. – pron

Các vấn đề liên quan