2013-02-22 24 views
25

Tôi có một phương pháp hiệu suất quan trọng được gọi thường xuyên khi ứng dụng của tôi khởi động. Cuối cùng, nó được JIT biên soạn, nhưng không phải sau một thời gian đáng chú ý được chạy trong trình thông dịch.Tôi có thể buộc JVM thực sự biên dịch một phương thức nhất định không?

Có cách nào tôi có thể nói với JVM rằng tôi muốn phương pháp này được biên dịch ngay từ đầu (mà không cần chỉnh sửa nội bộ khác bằng các công cụ như -XX:CompileThreshold)?

+0

bạn có thể chạy một hiện tượng tổng hợp thực tế của phương pháp đó hay thực hiện các công cụ không thể giả mạo? – Matt

+1

Phương pháp này được sử dụng để phân tích các tệp cấu hình lớn ngay sau khi khởi động và đây là những gì tôi muốn tăng tốc. Sự ấm lên nhân tạo có lẽ sẽ không tốt vào thời điểm này, tôi đoán là ... –

+0

bạn có thể đơn giản hóa cấu hình của mình không? thay đổi nó từ xml sang định dạng thuộc tính đơn giản hơn hoặc bất kỳ thứ gì để giảm số lượng mã cần thiết để đọc? có thể chia cấu hình thành một phần "khởi động", nhỏ nhất có thể chỉ để khởi động và một phần chính mà bạn có thể tải trong nền? có thể song song công việc vì vậy ngay cả khi mã được giải thích bạn có thể đạt được tốc độ từ luồng nó? – radai

Trả lời

32

Cách duy nhất tôi biết là cờ -Xcomp, nhưng điều đó thường không được khuyến khích sử dụng. Nó ép buộc biên dịch JIT ngay lập tức của TẤT CẢ các lớp và các phương thức lần đầu tiên chúng được chạy. Nhược điểm là bạn sẽ thấy hiệu suất giảm khi khởi động ban đầu (do tăng hoạt động JIT). Giới hạn chính khác với cờ này là nó dường như vô hiệu hóa tối ưu hóa dựa trên lược tả gia tăng mà JIT thường làm. Trong chế độ hỗn hợp tiêu chuẩn, trình biên dịch JIT có thể (và sẽ) hủy kích hoạt và biên dịch lại các phần của mã liên tục dựa trên thông tin hồ sơ và thời gian chạy được thu thập. Điều này cho phép nó "chỉnh sửa" tối ưu hóa lỗi như kiểm tra ranh giới bị bỏ qua nhưng hóa ra là cần thiết, inlinings tối ưu vv -Xcomp vô hiệu hóa tối ưu hóa dựa trên lược tả và tùy thuộc vào chương trình, có thể gây tổn thất hiệu suất đáng kể tổng thể cho chỉ một nhỏ hoặc không có lợi ích thực sự khi khởi động, đó là lý do tại sao nó không được khuyến cáo sử dụng.

Beyond để -Xcomp (mà là khá tàn bạo) và -XX:CompileThreshold (kiểm soát có bao nhiêu hành của một phương pháp trao JIT sẽ chạy trong chế độ intepreted để thu thập số liệu thống kê trước khi biên dịch/tối ưu hóa nó), đó cũng là -Xbatch. Điều này buộc biên dịch JIT tới "tiền cảnh", về cơ bản chặn các cuộc gọi đến các phương thức cho đến khi nó được biên dịch, thay vì biên dịch nó trong nền như bình thường.

Bạn không chỉ định phiên bản Java bạn đang sử dụng, nhưng nếu Java 7 là tùy chọn cho bạn, nó sẽ giới thiệu một mô hình JIT mới có tên "Biên dịch tầng" (được kích hoạt với công tắc -XX:+TieredCompilation). Việc biên dịch theo tầng là gì, nó cho phép một biên dịch ban đầu, nhỏ hơn vào lần sử dụng đầu tiên của một phương thức và hơn một phần biên dịch/tối ưu hóa bổ sung, lớn hơn sau này, dựa trên dữ liệu lược tả đã thu thập được. Nghe có vẻ thú vị với bạn.

Nó được cho là yêu cầu một số chỉnh sửa và tham số/cấu hình bổ sung, nhưng tôi không có xung quanh để kiểm tra thêm.

+0

Cảm ơn bạn đã liệt kê tất cả các tùy chọn này. Quá xấu họ không thể được thiết lập ở một mức độ tốt hơn ... –

+0

tôi nghĩ rằng TieredCompilation sẽ không làm quá nhiều thiệt hại vì nó sẽ không thực sự thay đổi bất cứ điều gì trong thời gian dài – radai

2

không chắc liệu nó có hoàn toàn biên dịch mã hay không, nhưng bạn có thể thêm lớp học của mình bằng phương pháp quan trọng vào vùng dữ liệu được chia sẻ của JVM. xem this question để biết thêm chi tiết.

cũng có, bạn đã xem xét JNI chưa? nếu phương pháp của bạn là rất nhiều CPU, nó có thể tăng tốc độ đáng kể.

+0

Thú vị. Có vẻ như điều này chỉ cải thiện tải lớp và không chạm vào trình biên dịch JIT, mặc dù. Hay tôi đang thiếu một cái gì đó? Tôi muốn tránh JNI và phải biên dịch mã gốc trên tất cả các nền tảng mà chúng tôi triển khai ... –

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