2010-06-10 31 views
6

Tối ưu hóa dựa trên phân tích thoát là tính năng được lên kế hoạch cho Proguard. Trong thời gian chờ đợi, có bất kỳ công cụ hiện có nào như proguard đã thực hiện tối ưu hóa yêu cầu phân tích thoát không?Trình tối ưu hóa bytecode tĩnh java (như proguard) với phân tích thoát?

+2

SunSpot JVM của Sun đã thoát khỏi phân tích được tích hợp từ Sun Java 6 Update 14. Bạn cần bật nó bằng '-XX: + DoEscapeAnalysis'. Xem: http://java.sun.com/javase/6/webnotes/6u14.html – Jesper

+1

Phân tích thoát được tắt trên u18 trở lên. – gustafc

+1

Nó cũng chỉ có sẵn trên máy chủ VM, và không có sẵn ở tất cả trên valvik val android, cũng không phải bất kỳ biến thể javaME mà tôi biết. Vấn đề là làm phân tích thoát trước thời hạn để bạn có được những lợi ích ngay cả khi nó không được kích hoạt trong VM. –

Trả lời

3

Có, tôi nghĩ rằng Soot framework thực hiện phân tích thoát.

+1

Làm thế nào để bạn cấu hình muội để làm tối ưu hóa toàn bộ chương trình (chẳng hạn như phân tích thoát), trên các ứng dụng Android? Nó xuất hiện khuôn khổ chỉ đơn giản giả định bạn có một chức năng chính và xây dựng cây gọi từ đó, nhưng các ứng dụng Android không có chức năng chính.Proguard cho phép bạn giữ nhiều lớp, sao cho mỗi phương thức trong lớp trở thành một "root" mới trong phân tích cây cuộc gọi để tối ưu hóa toàn bộ chương trình. Tôi không thể tìm thấy một lựa chọn tương tự cho bồ hóng. –

+0

Sẽ đánh dấu đây là câu trả lời. Tôi đã mở một câu hỏi mới đặc biệt về muội và tối ưu hóa toàn bộ chương trình mà không có chức năng chính ở đây: http://stackoverflow.com/questions/3093648/how-to-use-soot-to-do-whole-program-optimizations-on- android-applications –

1

Bạn mong đợi điều gì từ phân tích thoát trên trình biên dịch? Các lớp Java giống như các tệp đối tượng trong C - chúng được liên kết trong JVM, do đó phân tích thoát có thể được thực hiện chỉ ở mức đơn phương, có khả năng sử dụng hạn chế và sẽ cản trở việc gỡ lỗi (ví dụ: bạn sẽ có dòng mã mà bạn không thể bước).

Trong thiết kế của Java, trình biên dịch khá câm - nó kiểm tra tính chính xác (như Lint), nhưng không cố gắng tối ưu hóa. Các mảnh thông minh được đặt trong JVM - nó sử dụng nhiều kỹ thuật tối ưu hóa để mang lại hiệu suất tốt mã trên nền tảng hiện tại, trong điều kiện hiện tại. Kể từ khi JVM biết tất cả các mã mà hiện đang được nạp nó có thể giả định nhiều hơn trình biên dịch và thực hiện tối ưu hóa đầu cơ được hoàn nguyên vào thời điểm các giả định bị vô hiệu. HotSpot JVM có thể thay thế mã bằng phiên bản được tối ưu hóa nhanh hơn khi chức năng đang chạy (ví dụ: ở giữa vòng lặp khi mã được 'nóng').

Khi không có trong trình gỡ lỗi, các biến có thời gian tồn tại không chồng chéo được thu gọn, các biến thể được thoát ra khỏi vòng lặp, vòng lặp chưa được kiểm soát, v.v. Tất cả điều này xảy ra trong mã JIT-ted và được thực hiện tùy thuộc vào thời gian trong chức năng này (nó không có ý nghĩa nhiều để dành thời gian tối ưu hóa mã mà không bao giờ chạy). Nếu chúng tôi thực hiện một số các tối ưu hóa này, thì JIT sẽ có ít tự do hơn và kết quả tổng thể có thể là số âm thuần. Tối ưu hóa khác là phân bổ các đối tượng không thoát khỏi phương pháp hiện tại - điều này được thực hiện trong một số trường hợp nhất định, mặc dù tôi đọc một bài báo ở đâu đó thời gian để thực hiện phân tích thoát nghiêm ngặt so với thời gian đạt được bằng cách tối ưu hóa. xứng đáng với nó, vì vậy chiến lược hiện tại là heuristic hơn.

Nhìn chung, JVM càng có nhiều thông tin về mã ban đầu của bạn thì càng có thể tối ưu hóa nó. Và việc tối ưu hóa JVM không ngừng cải thiện, do đó tôi sẽ nghĩ về tối ưu hóa mã được biên dịch chỉ khi nói về các JVM rất hạn chế và cơ bản như điện thoại di động. Trong những trường hợp này, bạn muốn chạy ứng dụng của bạn thông qua obfuscator anyway (để rút ngắn tên lớp, v.v.)

+0

Tôi chỉ quan tâm đến máy ảo dalvik và tôi bị khóa vào nhắm mục tiêu nền tảng 1,5/1,6 trong ít nhất 6 tháng khác và 2,1 trong ít nhất một năm. Ngay cả khi tôi có thể nhắm mục tiêu 2.2, JIT được điều chỉnh đặc biệt để có thời gian khởi động rất nhanh và dành ít thời gian nhất có thể trong JIT, vì vậy việc tối ưu hóa đắt tiền như phân tích thoát cộng với thay thế vô hướng hoàn toàn. Điều tôi đang tìm kiếm cụ thể là một trình tối ưu hóa bytecode tĩnh có thể thực hiện thay thế vô hướng dựa trên phân tích thoát cho các đối tượng tạm thời ngắn ngủi. –

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