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.
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. –
Ông liên kết với nguồn cho cả hai phiên bản. – Magnus
Trong 'Chỉnh sửa 2' của bạn, bạn có thể có nghĩa là 'không hiệu quả'? – ponzao