2010-06-26 29 views
19

Tôi không chắc liệu điều này có thuộc về StackOverflow hay trong nhóm Clojure Google hay không. Nhưng nhóm có vẻ bận rộn thảo luận numeric improvements for Clojure 1.2, vì vậy tôi sẽ thử tại đây:Hiệu suất ngắt số clojure

http://shootout.alioth.debian.org/ có một số điểm chuẩn hiệu suất cho các ngôn ngữ khác nhau.

Tôi nhận thấy rằng Clojure bị thiếu, vì vậy tôi đã tạo phiên bản Clojure của n-body problem.

Mã nhanh nhất tôi đã có thể sản xuất có thể found here, và benchmark nó dường như được nói rằng cho số crunching Clojure là

  • yếu tố ~ 10 nhanh hơn Python/Ruby/Perl
  • yếu tố ~ 4 chậm hơn so với C/Java/Scala/Ada
  • xấp xỉ ngang bằng với OCaml, Erlang và Go

tôi khá hài lòng với mức độ của hiệu suất.

Câu hỏi của tôi để các bậc thầy Clojure là

  • Có những cải tiến rõ ràng tôi đã bỏ lỡ, hoặc là về tốc độ hay về mã ngắn gọn hoặc dễ đọc (không có tốc độ hy sinh)?
  • Bạn có cho rằng đây là đại diện cho hiệu suất Clojure so với Python/Ruby/Perl trên một mặt và Java/C ở mặt khác không?

Cập nhật

More Clojure 1.1 chương trình benchmark cho loạt đá luân lưu here, bao gồm các vấn đề n thân.

+0

Tôi phải tưởng tượng JVM sẽ đóng vai trò lớn ở đây. Bạn đang sử dụng JVM nào? Bạn đang sử dụng cùng một như loạt đá luân lưu? –

+0

Java 1.6.0, java tiêu chuẩn đi kèm với OS X 10.6. Đó là khoảng cùng một JVM (tôi: 1.6.0_20, loạt đá luân lưu: 1.6.0_18) nhưng máy tính khác so với loạt đá luân lưu. Tôi chạy cả Clojure và triển khai thực hiện shootout Java cục bộ. Tôi ước tính hiệu suất tương đối bằng cách sử dụng Java làm cơ sở và mở rộng kết quả loạt đá luân lưu cho phù hợp. –

+0

Mã của bạn trông khá tốt. Với những cải tiến nguyên thủy trong 1.2 tôi hy vọng bạn có thể nhận được khá gần với thời gian Java. Bạn đã thử chạy nó thông qua một hồ sơ? Nghi ngờ của tôi là một cái gì đó ở đâu đó là thêm một đấm bốc hoặc chức năng cuộc gọi trên đó là làm tổn thương bạn. – mikera

Trả lời

4

Tôi tự hỏi nếu Cantor có thể được sử dụng cho bạn - đó là thư viện toán học hiệu suất cao cho Clojure. Ngoài ra, hãy xem this thread trên nhóm Google, đó là về một dự án tương tự trong bối cảnh của công cụ số học nguyên thủy mới.

+0

Cantor có vẻ hữu ích, tôi sẽ có một cái nhìn. Cảm ơn! –

11

Không phải là một lũ phản ứng ở đây :) nhưng dường như một số quan tâm, vì vậy tôi sẽ cố gắng trả lời câu hỏi của riêng tôi với những gì tôi đã học được trong vài ngày qua:

  • Với cách tiếp cận 1.1 tối ưu hóa (Java nguyên thủy và mảng có thể thay đổi) ~ 4x chậm hơn so với Java được tối ưu hóa là nhanh như nó đi.
  • Cấu trúc 1,2 definterfacedeftypenhanh hơn hai lần, đến trong khoảng 1,7x (+ 70%) của Java với mã ngắn hơn, đơn giản hơn và sạch hơn 1,1.

Dưới đây là việc triển khai:

More details bao gồm ảnh chụp màn hình "bài học kinh nghiệm", JVM phiên bản và profiling.

Nói chủ quan, tối ưu hóa mã 1.2 dễ dàng hơn so với tối ưu hóa 1.1, vì vậy đây là tin tốt cho việc crunching số Clojure. (Thực tế gần như tuyệt vời :)

Thử nghiệm 1.2 đã sử dụng nhánh chính hiện tại, tôi không thử bất kỳ nhánh số mới nào. Từ những gì tôi có thể thu thập những ý tưởng mới hiện đang được thảo luận

  • có thể làm cho không được tối ưu hóa numerics nhanh
  • có thể tăng tốc lên phiên bản 1.1 của tiêu chuẩn này
  • có thể sẽ không tăng tốc độ phiên bản 1.2, nó là đã được "gần với kim loại" vì nó có khả năng nhận được.

Phủ nhận:

  • Clojure 1.2 không được phát hành, vì vậy kết quả benchmark 1.2 là sơ bộ.
  • Đây là một điểm chuẩn cụ thể về tính toán vật lý. Nó có liên quan đến crunching số điểm nổi, nhưng không liên quan đến hiệu suất trong các lĩnh vực như phân tích cú pháp chuỗi, xử lý yêu cầu đồng thời hoặc yêu cầu web.
+1

Bạn nên thử các nhánh số, nhìn qua mã của bạn Tôi thấy những nơi mà bạn sẽ nhận được quyền không cần thiết nhận quyền anh dưới nhánh chính 1.2. – dnolen

+0

Cảm ơn lời khuyên. Các chi nhánh equiv đã có một số tác động trên phiên bản 1.1, không có sự khác biệt đáng chú ý cho phiên bản 1.2. Có thể có các triển khai thay thế, nơi sự khác biệt có ý nghĩa hơn. Chi nhánh equiv vẫn có vẻ tốt, đặc biệt là các gợi ý kiểu nguyên thủy và: tĩnh. –

+0

Cảm ơn bạn rất nhiều vì những đóng góp rất thú vị của bạn. Tôi đặc biệt thích đọc các phân tích chi tiết. Tôi đã biên dịch phiên bản 1.2 và so sánh nó với ví dụ Java trong một vài lần chạy và nó chỉ ở mức trung bình chậm hơn 1,5 lần. Hai câu hỏi đã được gợi lên từ phía tôi. Như bạn đã nói trong phân tích của bạn, mã không phải là thành ngữ vì nó sử dụng các biến có thể thay đổi được. Mã sẽ hoạt động chậm hơn bao nhiêu nếu các biến không thay đổi được sử dụng? Bao nhiêu nỗ lực sẽ được tham gia vào việc song song với phiên bản bất biến hoặc bất biến? –

4

Đây là một câu hỏi hơi cũ và câu trả lời hiện được phần nào trong ngày, vì vậy tôi muốn thêm một bản cập nhật tính đến giữa năm 2013 cho những người quan tâm đến "số crunching" trong Clojure

Đã có nhiều điều xảy ra trong không gian tính toán số của Clojure:

  • Giờ đây, Clojure 1.5 đã được hỗ trợ nhiều hơn cho các phép toán số. Trong hầu hết các trường hợp, đó là bây giờ có thể có được rất gần với tốc độ tinh khiết Java
  • Một nhóm tin chuyên dụng - Numerical Clojure
  • core.matrix hiện nay cung cấp một API ngữ cho toán ma trận/máy tính số có hỗ trợ triển khai nhiều phụ trợ (bao gồm BLAS mẹ đẻ thư viện)

Tuyên bố từ chối trách nhiệm: Tôi là người duy trì/đóng góp cho một số điều trên.