2011-09-27 30 views
5

Có bất kỳ điểm chuẩn vi mô nào được công bố so sánh bộ sưu tập Scala có thể thay đổi và bất biến với nhau và các bộ sưu tập trong java.util.concurrent, trong môi trường đa luồng ? Tôi đặc biệt quan tâm đến các trường hợp người đọc vượt xa số lượng nhà văn, giống như bộ nhớ đệm HashMaps trong mã phía máy chủ.Micro-benchmark so sánh các bộ sưu tập Scala có thể thay đổi được với các bộ sưu tập java.util.concurrent. *

Điểm chuẩn vi mô của bộ sưu tập Clojure cũng sẽ được chấp nhận, vì thuật toán của chúng tương tự như thuật toán được sử dụng trong bộ sưu tập liên tục Scala 2.8.

Tôi sẽ tự viết nếu không có gì đã thực hiện, nhưng việc viết tiêu chuẩn vi điểm tốt không phải là tầm thường.

+0

Tôi nghĩ rằng điều đó là cực kỳ khó, bạn sẽ nhận được bất kỳ điểm chuẩn hợp lý nào so sánh các bộ sưu tập có thể thay đổi và bất biến, bởi vì thiết kế của ứng dụng đó là khác nhau. –

+0

@Daniel: Hiện tại chúng tôi có một số mã máy chủ Java có chứa HashMaps được đọc khoảng 1.000.000 lần cho mỗi lần viết. Mã này sử dụng 'đồng bộ', nhưng người đọc trả tiền phạt cho tất cả những người đọc bị tranh chấp mặc dù dữ liệu có hiệu quả bất biến. Tôi nghĩ rằng tôi có thể sử dụng các bộ sưu tập liên tục từ functionaljava và chỉ khóa khi thay thế bộ sưu tập cũ bằng bộ sưu tập "sao chép" mới chứa mục mới. – Ralph

+0

Trông giống như một kỳ vọng hợp lý và nó minh họa vấn đề với điểm chuẩn. Nếu bạn kiểm tra loại tải đó, bạn đang thiên về tính bất biến. Nhưng lưu ý rằng, bằng cách sử dụng bản đồ bất biến, bạn phải _replace_ bản đồ bất cứ khi nào bạn cập nhật, có nghĩa là bạn sẽ cần phải tuần tự hóa tất cả các bản cập nhật bằng cách nào đó. Bản thân bản đồ có thể được chỉ ra bởi một vật dễ bay hơi, nếu bạn không nhớ đọc các phần sau bị trễ. –

Trả lời

2

Có một số kết quả so sánh bản đồ Java băm, bản đồ băm Scala, bản đồ băm đồng thời Java, danh sách bỏ qua đồng thời Java, mảng song song Java và bộ sưu tập song song Scala ở đây (ở phần cuối của báo cáo kỹ thuật):

http://infoscience.epfl.ch/record/165523/files/techrep.pdf

có một so sánh chi tiết hơn về danh sách bỏ qua đồng thời và Java băm đồng thời các bản đồ về ở đây (cũng ở phần cuối của phần chính của báo cáo, trước khi phụ lục):

http://infoscience.epfl.ch/record/166908/files/ctries-techreport.pdf

Các tiêu chuẩn vi mô này tập trung vào việc kiểm tra hiệu suất của một thao tác đơn lẻ. Nếu bạn có kế hoạch để viết các tiêu chuẩn của riêng mình, điều này có lẽ sẽ hữu ích:

http://buytaert.net/files/oopsla07-georges.pdf

+0

Rất đẹp! Cảm ơn. – Ralph

+0

Bạn có thể tìm mã nguồn cho một số điểm chuẩn trong bài viết đầu tiên tại đây: http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk/test/benchmarks/, nhưng chúng có phần không được cấu trúc. Đối với lần thứ 2: https://github.com/axel22/Ctries, hãy xem trong src/bench. – axel22

+0

Dưới đây là các tiêu chí chi tiết về các hoạt động thu thập của Scala: https://github.com/scalameter/scalameter/tree/master/src/test/scala/org/scalameter/collections – axel22

0

Tại sao bạn không thử sử dụng java.util.concurrent.ConcurrentHashMap? theo cách đó bạn không phải đồng bộ hóa, và hàng triệu lần đọc của bạn sẽ nhanh hơn nhiều (cũng như viết).

+1

Tôi tin rằng đó là một sai lầm. Nếu bạn đọc một giá trị (có thể thay đổi) từ HashMap, hãy cập nhật giá trị đó, sau đó thử đặt lại, bạn vẫn phải đồng bộ hóa thao tác. Tôi không chắc chắn nếu bạn có thể làm điều đó với 'thay thế'. – Ralph

+0

Một tùy chọn khác là sử dụng STM của Clojure (bạn có thể sử dụng nó từ Java). Mặc dù tôi không chắc chắn làm thế nào bạn muốn sử dụng nó với một HashMap ... – Chochos

1

Li Haoyi của Benchmarking Scala Collections là một nghiên cứu chi tiết và toàn diện nhằm giải quyết truy vấn của bạn. Đó là cách quá dài để báo giá ở đây.

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