2010-03-19 31 views
16

Câu hỏi thực sự nói lên tất cả.Scala hoạt động tốt như thế nào so với Java?

Lý do đằng sau câu hỏi này là tôi chuẩn bị bắt đầu một dự án nhỏ và muốn làm điều đó trong Scala. Tôi đang học scala trong một tháng qua và bây giờ tôi cảm thấy thoải mái khi làm việc với nó. Trình biên dịch scala chính nó là khá chậm (trừ khi bạn sử dụng fsc). Vậy nó hoạt động tốt như thế nào trên JVM? Trước đây tôi đã từng làm việc trên groovy và tôi đã nhìn thấy đôi khi hơn thực hiện hơn java. Câu hỏi của tôi là cách hoạt động của Scala trên JVM so với Java. Tôi biết scala có một số tính năng rất tốt (FP, năng động lang, tĩnh gõ ...) nhưng cuối ngày chúng tôi cần hiệu suất ...

+2

Hãy nhớ rằng trình biên dịch Scala có nhiều việc phải làm hơn trình biên dịch Java. Nó chỉ được mong đợi rằng nó sẽ không được nhanh như những gì bạn đã trở nên quen với các ngôn ngữ đơn giản. –

Trả lời

25

Phần lớn công việc của tôi sử dụng Scala làm ngôn ngữ hiệu năng cao. Nếu thực sự chú ý cẩn thận đến hiệu suất, Scala gần như luôn luôn gần như tốt như Java (nếu không tương đương). Nếu một người bất cẩn về ví dụ: đối tượng sáng tạo, nó có thể tồi tệ hơn nhiều lần - như nó có thể trong Java nếu bạn sử dụng một thư viện mà là bất cẩn về sáng tạo đối tượng. (Thực tế, mã Scala của tôi thường nhanh hơn mã Java của tôi vì tôi thấy nó dễ dàng hơn nhiều để làm cho mã được tối ưu hóa cao của tôi thuận tiện để sử dụng và tái sử dụng - nhưng Java sẽ nhanh hay nhanh hơn nếu chỉ có nhiều thời gian hơn và kiên nhẫn.)

Nếu bạn muốn một số dữ liệu chứng minh rằng Scala có thể cơ bản nhanh như Java, hãy kiểm tra kết quả trên Computer Languages Benchmark Game. (Một ít so sánh hữu ích nhưng vẫn thú vị cho lập trình đa lõi thông lượng cao là của Tim Bray Wide Finder 2. Điều này ít hữu ích hơn vì thuật toán không được xác định trước, do đó phần lớn sự khác biệt sẽ làm giảm sự khác biệt trong thuật toán.)

+2

Tạo đối tượng trong Java JVM hiện đại 1.5> thực tế miễn phí, đây chỉ là FUD. Scala là chậm hơn so với Java bản địa vì tất cả các hướng dẫn cho tất cả các tính năng ngôn ngữ cụ thể của Scala giống như Groovy. Bạn nên mong đợi nhiều như một hình phạt 5X tốc độ so với Java trên cùng một JVM. –

+11

@ mờ: Bạn chỉ đơn giản là sai. Hãy xem xét các tiêu chuẩn tôi đã liên kết. Họ có hỗ trợ vị trí của bạn không? Chăm sóc để đăng những người khác làm gì? Bạn đã thực hiện microbenchmarking để cho biết cách tạo đối tượng nhanh được so sánh với một lớp indirection - và làm thế nào JIT có thể loại bỏ indirection khi nó không thực sự cần thiết? (Gợi ý: Tôi có, và đó là lý do tại sao tôi đăng những gì tôi đã làm.) –

+10

@fuzzy Tôi ủng hộ Rex ở đây. Tạo đối tượng là rẻ, nhưng nếu tất cả các bạn đang làm là một số ít các phép toán trong vòng lặp bên trong, thì, bằng cách so sánh, việc tạo đối tượng là rất tốn kém. –

13

Scala được biên dịch thành mã byte và được nhập tĩnh vì vậy nhiều tối ưu hóa tương tự có thể được thực hiện cho các ngôn ngữ được gõ tĩnh như Java (trái ngược với các ngôn ngữ được gõ động như Groovy). Vì vậy, so sánh Groovy với Scala là so sánh táo với cam.

Bây giờ, Java để Scala so sánh:

Bạn có thể mong đợi Scala là ngang bằng với Java trong hầu hết các tình huống. Scala có thể chậm nếu bạn lập trình một cách ngu xuẩn, ví dụ, tông màu của các bản mix thông qua Traits có thể cung cấp một số chi phí mà Java đơn giản sẽ không có.

Nhưng ...

Nếu đặc điểm đang thực sự giải quyết một vấn đề phức tạp trong hương vị tốt, sau đó là một giải pháp trong đồng bằng Java sẽ phải giải quyết cùng phức tạp. Ai nói giải pháp bạn viết bằng Java sử dụng các mẫu của riêng bạn sẽ hiệu quả hơn những gì bạn nhận được miễn phí trong Scala (hãy nhớ, trình biên dịch Scala được viết bởi những người có lẽ là một lập trình viên tốt hơn bạn). Mặt khác, nếu bạn đang sử dụng các tính năng ngôn ngữ không có lý do chính đáng (ví dụ, các đối tượng Integer khi nguyên gốc int sẽ làm), mã của bạn sẽ bị cồng kềnh, chậm chạp, crap bất kể bạn sử dụng ngôn ngữ nào.

Ngoài ra, hãy xem xét lớp đặc biệt của các ứng dụng dựa trên yêu cầu phản hồi tương tác với cơ sở dữ liệu hoặc tài nguyên chuyên sâu I/O khác. Cổ chai sẽ không phải là toán tử 'mới' hoặc phí gọi phương thức ảo - nó gần như chắc chắn sẽ là I/O.

Tóm lại, hiệu suất giữa Scala và Java là như nhau, và không nên là lý do lớn nhất bạn chọn một trong số khác trong 99% trường hợp. Vì lao động có tay nghề cao hơn phần cứng máy tính, bạn nên chọn ngôn ngữ mà bạn có thể (hoặc có thể học) chương trình hiệu quả nhất (bao gồm cả đồng đội của bạn). Nếu Scala cho phép bạn viết một phần mười mã như Java, bạn có thể nhận được 10X lợi ích bằng cách sử dụng nó.Nếu Scala làm chậm bạn xuống 10 lần (vì nó quá khó để đọc), gắn bó với Java!

+5

Điều này hoàn toàn đúng theo lý thuyết. Trong thực tế, nếu bạn đo lường mọi thứ thay vì chỉ mong đợi mọi thứ, mã Scala có xu hướng chậm hơn đáng kể so với mã Java, giống như trong thực tế mã Java có xu hướng chậm hơn mã C++. "Đừng lo lắng về tốc độ, ném phần cứng ở mã chậm" đối số là ít đúng mỗi ngày. Về phía khách hàng, netbook và điện thoại di động KHÔNG nhanh. Phía máy chủ, có áp lực để giảm sử dụng năng lượng. Chúng tôi sẽ không quay trở lại ASM điều chỉnh bằng tay, nhưng đáng để suy nghĩ cẩn thận những gì Scala mua cho bạn. – Porculus

+1

Thực ra, tôi chưa thể gặp phải bất kỳ sự tăng tốc có thể đo lường nào bằng cách chuyển bất kỳ chương trình nào từ Scala sang Java một mình. –

+6

@Porculus: Bạn có bất kỳ dữ liệu thực tế nào để hỗ trợ cho ý kiến ​​của mình không? Mặc dù tôi có thể đồng ý với sự so sánh của bạn giữa Java/C++, tôi không thấy cách áp dụng điều này với Scala so với Java. Cũng giống như lập luận rằng GCC tạo các tệp nhị phân có xu hướng chậm hơn đáng kể, vì bạn đã sử dụng trình phân tích cú pháp A thay vì trình phân tích cú pháp B cho C++. – soc

5

Tôi đồng ý với ý kiến ​​của Rex trong bài đăng này và tôi có kinh nghiệm cá nhân để hỗ trợ nó. Tôi đã chuyển đổi một applet chế biến từ java thành scala, mà không thay đổi bất kỳ chi tiết triển khai nào, và cả hai applet đều trả về một khung trong ~ 6ms, với ít biến đổi.

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