2010-07-15 39 views
25

Tôi đã viết một mô phỏng của Ring network topology trong Scala (source here) (Scala 2.8 RC7) và Clojure (source here) (Clojure 1.1) để so sánh các Diễn viên và Đại lý.Các tác nhân của Clojure so sánh với các diễn viên của Scala như thế nào?

Trong khi phiên bản Scala hiển thị tỷ lệ trao đổi tin nhắn gần như không đổi khi tôi tăng số lượng nút trong mạng từ 100 lên 1000000, phiên bản Clojure hiển thị tốc độ tin nhắn giảm với số lượng nút tăng. Cũng trong một lần chạy, tốc độ tin nhắn trong phiên bản Clojure giảm khi thời gian trôi qua.

Vì vậy, tôi tò mò về cách diễn viên của Scala so sánh với các đại lý của Clojure? Các đại lý vốn có ít đồng thời hơn các diễn viên hay là mã được viết không hiệu quả (autoboxing?)?

PS: Tôi lưu ý rằng việc sử dụng bộ nhớ trong phiên bản Scala tăng rất nhiều với số lượng nút tăng (> 500 MB cho 1 triệu nút) trong khi Clojure sử dụng ít bộ nhớ hơn nhiều (~ 100 MB cho 1 triệu nút).

Edit:

Cả hai phiên bản đang chạy trên cùng một JVM với tất cả các args JVM và diễn viên và các thông số cấu hình Agent thiết lập như mặc định. Trên máy của tôi, phiên bản Scala cho tốc độ tin nhắn khoảng 5000 tin nhắn/giây liên tục cho 100 đến 1 triệu nút, trong khi phiên bản Clojure bắt đầu với 60000 tin nhắn/giây cho 100 nút giảm xuống 200 tin nhắn/giây cho 1 triệu nút.

Chỉnh sửa 2

Hóa ra rằng phiên bản Clojure của tôi đã không có hiệu quả bằng văn bản. Tôi đã thay đổi loại bộ sưu tập nodes từ list thành vector và giờ nó hiển thị hành vi nhất quán: 100000 thư/giây cho 100 nút và 80000 thư/giây cho 100000 nút. Vì vậy, Clojure Đại lý dường như nhanh hơn so với diễn viên Scala. Tôi cũng đã cập nhật các nguồn được liên kết.

+0

Có một cách để làm cho diễn viên Scala "không có chủ đề". Tôi không biết nhiều về Clojure, nhưng sẽ rất tuyệt nếu bạn đăng (các phần liên quan) mã nguồn của bạn. –

+0

Ông liên kết với nguồn cho cả hai phiên bản. – Magnus

+0

Trong 'Chỉnh sửa 2' của bạn, bạn có thể có nghĩa là 'không hiệu quả'? – ponzao

Trả lời

28

[Disclaimer: Tôi đang trên đội Akka]

Một Agent Clojure là một con quái vật khác nhau từ một diễn viên Scala, đáng chú ý nhất nếu bạn nghĩ về người kiểm soát hành vi. Trong các tác nhân, hành vi được định nghĩa bên ngoài và được đẩy tới tác nhân và trong các diễn viên, hành vi được xác định bên trong diễn viên.

Không biết gì về mã của bạn Tôi không thể nói nhiều, bạn có sử dụng cùng các thông số JVM hay không, làm ấm mọi thứ, thiết lập hợp lý cho Actors so với cài đặt hợp lý cho Đại lý hoặc điều chỉnh riêng?

Như một mặt lưu ý: Akka có một thực hiện các băng ghế dự bị chiếc nhẫn nằm ở đây: http://github.com/jboner/akka-bench/tree/master/ring/

Sẽ là thú vị để xem những gì kết quả được so sánh với thử nghiệm Clojure của bạn trên máy tính của bạn.

+7

Đây là gần ba tuổi, bây giờ :) Sẽ rất thú vị để xem một bản cập nhật bây giờ mà clojure là khoảng phiên bản 1.5.1 và scala là khoảng 2.10.1 –

+2

@ Reb.Cabin ra quan tâm Tôi cập nhật mã để chạy trên các phiên bản Scala (2.11.2), Akka (2.3.5) và Clojure (1.6.0) mới nhất. Tôi nhận được kết quả tương tự cho Clojure (~ 80K msg/giây cho 1K đến 100K nút), nhưng hiệu suất tốt hơn nhiều từ Scala (+ 1M msg/giây cho các nút 10M). Điều này có thể được mong đợi vì nhóm Akka sẽ tích cực tối ưu hóa thông lượng tin nhắn trong khi giải pháp Clojure có mục đích chung hơn. – RoryD

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