2012-04-22 32 views
45

Ngôn ngữ Julia biên dịch tập lệnh mỗi lần, chúng ta có thể biên dịch các tập tin nhị phân với julia không? Tôi đã thử một kịch bản helloworld nhỏ với chức năng println mất khoảng 2,3 giây để julia hiển thị đầu ra! Sẽ tốt hơn nếu chúng ta có thể tạo các tệp nhị phân thay vì biên dịch mỗi lầnJulia biên dịch kịch bản mỗi lần?

Cập nhật: Đã có một số thay đổi trong Julia, vì tôi đã hỏi câu hỏi này. Mặc dù tôi không theo dõi các cập nhật cho julia nữa, vì tôi đã hỏi câu hỏi này và nếu bạn đang tìm kiếm một cái gì đó tương tự, hãy xem xét các câu trả lời và nhận xét dưới đây của những người theo dõi julia.

Ngoài ra, tốt để biết rằng bây giờ phải mất khoảng 150ms để tải tập lệnh.

Trả lời

35

Hiện tại Julia JIT biên soạn toàn bộ thư viện chuẩn khi khởi động. Chúng tôi nhận thức được tình hình và hiện đang làm việc trên bộ nhớ đệm đầu ra LLVM JIT để khắc phục tình trạng này, nhưng cho đến lúc đó, không có cách nào xung quanh nó (ngoại trừ việc sử dụng REPL).

+17

Điều này đã được thực hiện trong các đêm ở Julia và sẽ được đưa vào bản phát hành 0.3. Thời gian khởi động được cải thiện rất nhiều. –

88

Câu trả lời của Keno được phát hiện, nhưng có lẽ tôi có thể cung cấp thêm một chút chi tiết về những gì đang diễn ra và những gì chúng tôi đang dự định làm.

Hiện nay chỉ có một chế độ LLVM JIT:

  • Có một thông dịch viên rất tầm thường đối với một số báo cáo cấp cao nhất đơn giản.
  • Tất cả các mã khác được đưa vào mã máy trước khi thực thi. Mã này được chuyên biệt hóa mạnh mẽ bằng cách sử dụng các kiểu thời gian chạy của các giá trị mà mã đang được áp dụng cho, được truyền qua chương trình bằng cách sử dụng suy luận kiểu động.

Đây là cách Julia được hiệu suất tốt ngay cả khi mã được viết không có loại chú thích: nếu bạn gọi f(1) bạn nhận được mã chuyên cho Int64 - loại 1 trên hệ thống 64-bit; nếu bạn gọi f(1.0), bạn sẽ nhận được phiên bản mới được công bố dành riêng cho Float64 - loại 1.0 trên tất cả các hệ thống. Vì mỗi phiên bản được biên dịch của hàm đều biết loại nào sẽ nhận được, nó có thể chạy ở tốc độ giống như C. Bạn có thể phá hoại điều này bằng cách viết và sử dụng các hàm "type-unstable" có kiểu trả về phụ thuộc vào dữ liệu thời gian chạy, chứ không chỉ là các kiểu, nhưng chúng tôi rất cẩn thận không làm điều đó trong thiết kế ngôn ngữ chính và thư viện chuẩn.

Hầu hết Julia được viết trong chính nó, sau đó phân tích cú pháp, gõ-inferred và jitted, do đó, bootstrapping toàn bộ hệ thống từ đầu mất khoảng 15-20 giây. Để làm cho nó nhanh hơn, chúng tôi có một hệ thống dàn dựng, nơi chúng tôi phân tích cú pháp, gõ-infer, và sau đó cache một phiên bản được tuần tự hóa của AST kiểu được suy ra trong tệp sys.ji. Tệp này sau đó được tải và sử dụng để chạy hệ thống khi bạn chạy julia. Tuy nhiên, không có mã LLVM hoặc mã máy nào được lưu trong bộ nhớ trong sys.ji, do đó, tất cả các lệnh bắt LLVM vẫn cần phải được thực hiện mỗi lần julia khởi động, do đó mất khoảng 2 giây.

Thời gian trễ khởi động 2 giây này khá khó chịu và chúng tôi có kế hoạch sửa lỗi. Kế hoạch cơ bản là có thể biên dịch toàn bộ chương trình Julia thành nhị phân: một trong hai tệp thực thi có thể chạy hoặc .so/.dylib thư viện được chia sẻ có thể được gọi từ các chương trình khác như thể chúng được chia sẻ đơn giản là thư viện C. Thời gian khởi động cho một nhị phân sẽ giống như bất kỳ chương trình C nào khác, do đó, thời gian trễ khởi động 2 giây sẽ biến mất.

Phụ lục 1: Kể từ tháng 11 năm 2013, phiên bản phát triển của Julia không còn bị chậm trễ khởi động 2 giây vì nó biên dịch trước thư viện chuẩn dưới dạng mã nhị phân. Thời gian khởi động vẫn chậm hơn gấp 10 lần so với Python và Ruby, do đó có chỗ để cải thiện, nhưng nó khá nhanh. Bước tiếp theo sẽ là cho phép biên dịch trước các gói và các kịch bản để những người có thể khởi động nhanh như chính Julia đã làm.

Phụ lục 2: Kể từ tháng 6 năm 2015, phiên bản phát triển của Julia tự động biên dịch nhiều gói, cho phép chúng tải nhanh. Bước tiếp theo là biên dịch tĩnh của toàn bộ chương trình Julia.

+6

Tôi đã nhìn thấy một số nhận xét trên Web từ năm ngoái hoặc lâu hơn cho thấy rằng các tệp thi hành được biên dịch/các đối tượng được chia sẻ là mục tiêu cho Julia, nhưng không có bất kỳ dấu hiệu nào về tiến trình. Bạn có thể cung cấp bất kỳ thông tin chi tiết nào về những thứ đứng trên đó không? – dfreeman

+2

Rất nhiều tiến bộ đã được thực hiện bởi Jameson Nash và Isaiah Norton, nhưng nó chưa hoàn toàn ở đó. – StefanKarpinski

+23

Chức năng này hiện đã hoàn thành và được hợp nhất trên Julia master. Thay vì dùng ~ 1,5 giây trên hệ thống của tôi để khởi động Julia, bây giờ nó mất ~ 150 mili giây - một tốc độ gấp 10 lần ấn tượng. Nếu chúng ta có thể quản lý để tích lũy một tốc độ 10x khác, điều này hoàn toàn có thể, thời gian khởi động của Julia sẽ có thể so sánh được với Ruby và Python. – StefanKarpinski

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