2011-06-30 30 views
5

Khi bạn muốn nén hiệu suất cuối cùng từ mã của mình, bạn sẽ muốn tận dụng tối ưu hóa JIT tốt nhất có thể. Ví dụ, phương pháp đánh dấu cuối cùng cho nội tuyến phương pháp dễ dàng, tránh đa hình ở những nơi quan trọng, v.v.Làm thế nào để viết mã Java JIT thân thiện với tối ưu?

Nhưng tôi không thể tìm thấy bất kỳ tham chiếu hoặc danh sách các tùy chọn mà một lập trình viên java có thể sử dụng để 'gợi ý' trình biên dịch JIT mã? Không nên chúng ta có một danh sách 'thực hành lập trình tốt nhất' cho hiệu suất độ trễ thấp từ JIT?

+0

Không phải là câu trả lời cho câu hỏi của bạn, nhưng nếu bạn quan tâm đến Java hiệu suất cao, bạn có thể quan tâm đến thư viện [fastutil] (http://fastutil.dsi.unimi.it/) ít được biết đến. Đó là một phần mở rộng hiệu suất cao của khung bộ sưu tập. –

+0

Bạn có thể làm rõ lý do tại sao bạn quan tâm đến điều này? Bạn có vấn đề về hiệu suất không? hay nó hoàn toàn là học thuật? :-) – drekka

+0

Các vấn đề về hiệu năng tôi có thể chủ yếu được khắc phục bằng cách điều chỉnh GC hoặc cải thiện thuật toán. Tuy nhiên, nếu tôi phải vượt qua điều đó, ví dụ như xử lý hình ảnh, nhận dạng mẫu, v.v, tôi muốn biết các công cụ tối ưu hóa hiệu suất khác mà tôi có trong tay là gì. Bạn có thể gọi nó là học thuật. – Sajid

Trả lời

7

Tác giả của HotSpot và những người khác đã nhiều lần tuyên bố rằng cách tiếp cận tốt nhất là viết mã đơn giản đơn giản.

+1

+1: JIT tìm kiếm các mẫu phổ biến mà nó biết cách tối ưu hóa. Nếu bạn viết mã khó hiểu hoặc mã với cấu trúc bất thường, nó sẽ gây nhầm lẫn cho JIT (dễ dàng thực hiện, chỉ là một chương trình của nó) và nó cũng sẽ không tối ưu hóa mã. –

10

Cách tốt nhất để viết mã thân thiện với JIT là viết mã thẳng, đơn giản vì đây là những gì mà JIT tìm kiếm và biết cách tối ưu hóa. Không bịp bợm!

Cũng khác nhau của JVM có JIT khác nhau, do đó, để chắc chắn mã của bạn hoạt động tốt với tất cả chúng, bạn không phải dựa vào bất kỳ của chúng.

Cách thông thường để cải thiện hiệu suất JIT là thông qua cấu hình bên ngoài của JVM. Như hầu hết các JVM của những ngày này biết làm thế nào để nội tuyến cuộc gọi phương thức nhỏ trực tiếp, hầu hết các lợi ích hiệu suất đến từ cấu hình bộ thu rác. Ở đây nhiều nỗ lực được sử dụng để tránh phải dừng chương trình của bạn trong khi thu thập, và bạn có thể tinh chỉnh một chút với kiến ​​thức của bạn về cách phần cứng cơ bản được cấu hình và những gì làm việc tốt hơn so với những người khác. Nhưng không phải mã Java, nó cần phải thẳng thắn và đơn giản.

+2

Tôi khuyên bạn nên cố gắng tìm các trang trình bày hoặc PDF cho "Các cuộc tấn công về hiệu suất công nghệ Java tiếp xúc" JavaOne talk by Cliff Click (Hotspot hacker, cựu Sun, đã ở Azul Systems một thời gian). [Blog] của anh ấy (http://www.azulsystems.com/blog/) cũng luôn có các cuộc thảo luận nội bộ JVM thú vị. Và, btw, "làm cho phương pháp cuối cùng để giúp với nội tuyến" "tối ưu hóa" chỉ là một huyền thoại. – vanza

+0

@vanza Vâng các slide rất khó tìm. Nhưng có ít nhất một lợi thế của một phương thức cuối cùng: JIT không phải suy luận bằng cách nào đó rằng không có phân lớp đầy đủ nhưng luôn có thể tránh được lời gọi động - điều này sẽ đạt được một số lợi ích hiệu suất nhỏ trong một số trường hợp. Không phải điều đó sẽ đáng chú ý nhưng hey;) – Voo

+1

@Voo: Điểm phát sóng đã tránh các lời gọi động bất cứ khi nào có thể (ví dụ: giao diện hoặc lớp trừu tượng với lớp bê tông đơn được nạp thực hiện), "cuối cùng" là không cần thiết. Theo tinh thần của tin nhắn gốc, và những gì tôi luôn nghe từ tin tặc JIT: sử dụng "cuối cùng" (và các tính năng ngôn ngữ khác) khi nó có ý nghĩa trong mã của bạn, không phải vì bạn nghĩ nó sẽ làm cho mã của bạn nhanh hơn. – vanza

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