2010-03-16 29 views
6

Sử dụng trình biên dịch chứng khoán Sun 1.6 và JRE/JIT, có nên sử dụng loại cuộn bao mở rộng được thiết kế bởi Duff's Device để bỏ vòng lặp không? Hay nó kết thúc như mã obfuscation không có lợi ích hiệu suất?Thiết bị của Duff có tăng tốc mã Java không?

Các công cụ lược tả Java tôi đã sử dụng ít thông tin hơn về việc sử dụng CPU từng dòng hơn, ví dụ, valgrind, vì vậy tôi đang tìm cách tăng thêm số đo với trải nghiệm của người khác. Lưu ý rằng, tất nhiên, bạn không thể chính xác mã Thiết bị của Duff, nhưng bạn có thể thực hiện việc hủy đăng ký cơ bản và đó là những gì tôi đang băn khoăn.

 short stateType = data.getShort(ptr); 
     switch (stateType) { 

     case SEARCH_TYPE_DISPATCH + 16: 
      if (c > data.getChar(ptr + (3 << 16) - 4)) { 
       ptr += 3 << 16; 
      } 
     case SEARCH_TYPE_DISPATCH + 15: 
      if (c > data.getChar(ptr + (3 << 15) - 4)) { 
       ptr += 3 << 15; 
      } 
     ... 

thông qua nhiều giá trị khác.

+3

Tôi không hiểu câu hỏi đã sửa đổi của bạn. Thiết bị của Duff không có nghĩa là chỉ cần thông qua. Vòng lặp xen kẽ là một phần quan trọng. –

+5

Tại sao bạn không ... thử nghiệm nó? Viết phiên bản với vòng lặp như bình thường. Viết một phiên bản với vòng lặp chưa được kiểm. Viết một khuôn khổ thực thi mỗi một triệu lần (hoặc bất kỳ thứ gì). Xem những gì, nếu có, hiệu suất đạt được từ nỗ lực tối ưu hóa của bạn. –

+0

Không có câu trả lời hay nhất ??? O.o –

Trả lời

22

Nó không quan trọng cho dù đó là một ý tưởng tốt (nó không phải), bởi vì nó sẽ không biên dịch.

EDIT: Đây được đề cập một cách rõ ràng in the JLS:

Một thủ thuật được gọi là thiết bị Duff có thể được sử dụng trong C hoặc C++ để cuộn vòng lặp, nhưng đây không phải là mã hợp lệ trong ngôn ngữ lập trình Java:

Hoặc, một cách thẳng thừng hơn (từ phần giống nhau):

lớn C hack, Tom, nhưng nó không có giá trị ở đây.

EDIT: Để trả lời câu hỏi chung (quá) của bạn, thường là không. Bạn thường nên dựa vào JIT.

+0

Xin lỗi, tôi đã không làm cho câu hỏi khá không đủ chi tiết. – bmargulies

8

Bạn đang bỏ qua thực tế là Java biên dịch sang bytecodes cho máy ảo định hướng ngăn xếp. Bất kỳ mẹo tối ưu hóa cấp thấp nào bạn cố gắng ở cấp Java phần lớn đều không hiệu quả. Việc tối ưu hóa thực sự xảy ra khi trình biên dịch JIT tạo ra assembly cho kiến ​​trúc đích, một quá trình mà bạn không thể kiểm soát cũng như không quan tâm đến phần lớn.

Thay vào đó, bạn nên tối ưu hóa ở một bức tranh lớn hơn nhiều. Hãy để trình biên dịch JIT xử lý các tối ưu hóa ở mức độ thấp.

+0

+1 cho "xem ảnh lớn hơn" – Thilo

+5

Tôi không bỏ qua nó, tôi hỏi bạn về nó. – bmargulies

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