2011-01-27 34 views
6

Tôi vừa đọc về việc triển khai thực hiện scala generics specialization của scala và nó thực sự thu hút sự chú ý của tôi về tốc độ tăng mà chúng đạt được với tính năng này. Tôi đã tự hỏi những gì các tính năng khác có các ngôn ngữ mà mục tiêu java vm thực hiện mà thực sự làm cho họ thực hiện tốt hơn so với java? Tôi biết rằng mã được tạo ra càng chuyển động xa khỏi java, hiệu suất của nó càng giảm. Vì vậy, tôi thực sự tự hỏi những gì các tính năng khác có thể một ngôn ngữ thực hiện để đạt được hiệu suất tốt hơn trong java.Tốt nhất (scala & các ngôn ngữ khác nhắm mục tiêu java vm) tối ưu hóa

Vui lòng không trả lời câu hỏi này nói về các tính năng thực sự tốt đẹp của scala trên java, tôi đang nói nghiêm túc về hiệu suất.

Ngoài ra nếu bạn có các đề xuất vẫn chưa được triển khai, vui lòng trả lời!

Cảm ơn bạn!

+0

"Tôi biết rằng mã được tạo thêm sẽ chuyển từ java, hiệu suất của nó càng giảm." - Tôi không nghĩ điều này nhất thiết là đúng. Một số ngôn ngữ cho vay tốt hơn để tối ưu hóa hơn so với các ngôn ngữ khác, nhưng nó không thực sự có liên quan đến ngôn ngữ Java. – Jesper

+0

Vâng, thực sự nó không nhất thiết phải đúng, nhưng đúng là các kỹ sư vm tối ưu hóa tốt hơn cho các trường hợp sử dụng phổ biến nhất bởi ngôn ngữ java – Waneck

+0

Tôi không chắc liệu câu hỏi đó có đúng không. Mã được tạo ra là bytecode, như javacode, được biên dịch, là bytecode, vì vậy sau khi biên dịch, tôi nghĩ, chúng không thể phân biệt được. AFAIK, các ngôn ngữ như jRuby, jython vv chỉ sử dụng nhiều sự phản ánh hơn, điều này làm cho các chương trình chậm hơn. –

Trả lời

13

Scala hiện support tail-call optimization, Java, chỉ qua JVM, don't fully support yet.

+0

+1. Đó là một tối ưu hóa rất thú vị, và nếu JVM cuối cùng cũng được hỗ trợ cho nó, điều đó thậm chí còn đẹp hơn. – Thilo

+0

đó thực sự là một tối ưu hóa tuyệt vời! Cảm ơn! – Waneck

+0

có vẻ như điều này và các chuyên ngành generics là tối ưu hóa chính mà họ thực hiện. Tuyệt vời để biết, và tham khảo tuyệt vời! Cảm ơn! – Waneck

3

Có lẽ đây là quá tầm thường/cũ/nổi tiếng nhưng trình biên dịch Java tối ưu hóa literals String và concatenations sử dụng một hồ bơi String và StringBuilders:

String a = "a"; 
String b = "a"; 
String c = a + b + someUserInput; 

thực sự sẽ được gần gũi hơn với

String a = "a"; 
String b = a; 
String a_b = "aa"; 
String c = new StringBuilder(a_b).append(someUserInput).toString(); 

hoặc thậm chí có thể (không chắc chắn)

String a_b = "aa"; 
String a = a_b.substring(0,1); 
String b = a; 
String c = new StringBuilder(a_b).append(someUserInput).toString(); 

Ngoài ra, trọng tâm tối ưu hóa cho trình biên dịch Java đã chuyển từ biên dịch sang bytecode (javac) thành biên dịch từ bytecode thành mã máy (Hotspot). Tôi nghĩ rằng có nhiều ưu điểm hơn trong javac, nhưng họ đã thấy rằng hơi sớm vì Hotspot có thể làm một công việc toàn diện hơn ở đây (và dựa trên kiến ​​thức thời gian chạy về phần cứng và cách sử dụng thực tế).

Một khía cạnh thú vị khác của việc này là tối ưu hóa Hotspot có thể cải thiện hiệu suất lâu sau khi mã được viết và biên dịch. Ví dụ, việc tối ưu hóa StringBuilder ở trên được sử dụng để sử dụng lớp StringBuffer (hơi kém hiệu quả) trước Java 5. Để có được những cải tiến mới nhất, bạn cần phải biên dịch lại mã (vẫn tốt hơn so với việc tối ưu hóa bằng tay để sử dụng StringBuffer trước đó, trong trường hợp này bạn thực sự cần phải cập nhật mã).

+0

vâng, tôi biết rằng đó là loại chống lại triết lý của java để tối ưu hóa bytecode của nó. Nhưng vấn đề là, nếu bạn đang sử dụng rất nhiều tính năng chưa được tối ưu hóa tốt bởi trình biên dịch java, bạn sẽ không may mắn - chuyên ngành generics là một trong những tối ưu hóa đó. Tôi thực sự tự hỏi những gì có thể được thực hiện để thực hiện hành vi giống như cấu trúc, ví dụ, trong java. – Waneck

+0

Tôi đoán Scala có tiềm năng chia sẻ rất nhiều giá trị khác (những giá trị bất biến); Phải không? – Raphael

5

Scala tối ưu hóa những thứ như

val nullSafeToString = "" + foo 

để

val nullSafeToString = String.valueOf(foo) 

Java không, trong Java có vẻ như

val nullSafeToString = new StringBuilder("").append(foo) 

mà mất 4 lần bytecode hơn mã đơn giản của Scala và tạo một phiên bản StringBuilder mới và số String vô dụng.

Ở một bên, JVM được thực hiện để hỗ trợ những thứ mà họ đã lên kế hoạch sử dụng trong Java, ngay cả khi JVM chỉ thực thi bytecode.

Có các tính năng thiếu đối với độ tuổi để hỗ trợ tốt hơn chức năng (tailcalls) và ngôn ngữ không được nhập (InvokeDynamic).Tuy nhiên, ở phía bên kia, tôi ngạc nhiên khi trình biên dịch JIT có thể tối ưu hóa nhiều mã trừu tượng và các lớp không hướng dẫn và kết thúc với mã thực thi nhanh như mã Java.

Tôi nghĩ rằng mẫu "Pimp My Library" sẽ không phổ biến nếu JVM không thể xóa các bản sao của các mẫu đơn giản implicit + class RichFoo này bằng phân tích thoát.

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