2011-01-27 29 views
6

Trò chơi phát triển cho thiết bị Android, tôi cần phải nhắm mục tiêu các thiết bị không có JIT chút nào và chỉ dựa vào tối ưu hóa bytecode. Tôi tự hỏi liệu bộ tối ưu hóa này có trống hay không ...Tối ưu hóa Java: chỉ bytecode so với JIT

Thực ra, trình biên dịch java (phần cứng, javac, không phải là JIT) có thực hiện bất kỳ tối ưu hóa nào như chuyển đổi a/4 thành >> 2 không? Hoặc là mọi tối ưu hóa một công việc cho JIT?

+0

Phân chia so với thay đổi trái không có bất kỳ ảnh hưởng nào đến tốc độ chương trình tổng thể. Không phải một chút. – delnan

Trả lời

7

Trình biên dịch Java chuẩn thực hiện một số tối ưu hóa, nhưng nó để lại hầu hết trong số chúng cho JIT.

JIT biết bộ xử lý nào chính xác chương trình đang chạy và cũng có quyền truy cập vào thông tin thời gian chạy và do đó nó có thể thực hiện tối ưu hóa nhiều hơn trình biên dịch Java có thể thực hiện trước. Ngoài ra, việc tối ưu hóa rộng rãi trước có thể "làm xáo trộn" mã byte một chút, khiến JIT khó hơn để tối ưu hóa nó.

Tôi không biết trình biên dịch của Google làm gì khi dịch mã byte Java sang mã Dalvik - nó có thể đang thực hiện tối ưu hóa rộng hơn.

Có lẽ công cụ này sẽ hữu ích cho bạn: Dalvik Optimization and Verification With dexopt

Bằng cách này, ví dụ bạn đề cập đến không phải lúc nào cũng có giá trị; chuyển đổi a/4 thành a >> 2 không được đảm bảo để làm cho chương trình của bạn chạy nhanh hơn trên bất kỳ bộ xử lý nào. Tôi đọc một bài báo ở đâu đó một lần (xin lỗi, không thể tìm thấy nó ngay bây giờ ...) giải thích rằng trên (tôi nghĩ) bộ xử lý x86 hiện đại, a >> 2 thậm chí có thể chậm hơn a/4.

Trong mọi trường hợp, không thực hiện tối ưu hóa sớm như chuyển đổi a/4 thành a >> 2 bằng tay trong mã nguồn trừ khi bạn có bằng chứng thực (từ phép đo hiệu suất).

+0

Cảm ơn bạn (cả hai bạn). Tôi không thực sự làm bất kỳ tối ưu hóa vi mô nào, tôi thích khả năng đọc dễ dàng, nhưng chỉ tự hỏi liệu các thiết bị không có JIT có phải chịu mọi tội lỗi có thể hoặc nếu tối ưu hóa tầm thường được thực hiện bởi trình biên dịch. Như bạn đã đề cập, ví dụ của tôi không phải là tầm thường ... là một điều tồi tệ. –

2

Nếu nền tảng thực thi của bạn thực sự thực thi bytecode, trực giác của bạn về những thứ như a/4 nhanh hơn a >> 2 có thể là sai. Bạn cần phải làm một số hồ sơ ứng nghiêm trọng để tìm ra:

  • cho dù đó là tối ưu hóa giá trị ở tất cả,
  • nơi tập trung nỗ lực của bạn, và
  • gì (vi) tối ưu hóa thực sự làm việc.

FWIW, trình biên dịch javac không có khả năng cố gắng tối ưu hóa số học vi mô. Mã nguồn gốc tối ưu phụ thuộc vào phần cứng của nền tảng thực thi thực tế và nếu javac cố gắng tối ưu hóa bytecode, nó có khả năng làm cho nhiệm vụ của trình biên dịch JIT trở nên khó khăn hơn.

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