2009-03-12 33 views
5

Tôi có yêu cầu rằng một Bản đồ sẽ được xây dựng với tối đa 50 ~ 200 mục (có thể nhiều hơn, chúng ta hãy gọi nó là không quá ít). Các văn bản chỉ được thực hiện một lần và việc đọc (sử dụng Map.get ("keyName")) có thể đi hơn 20 cho mỗi yêu cầu (đó là một webapp).Viết một lần + nhiều bản đồ trong Java?

Tôi sẽ cho Hashmap hiện tại như tôi (tôi cho là) ​​mang đến cho tôi hiệu suất tối ưu nhất (lưu ý: nhiều lần đọc theo yêu cầu). Không phải là một anh chàng cấu trúc dữ liệu, có thể bất kỳ ai trong số các bạn đề xuất triển khai Bản đồ phù hợp nhất với yêu cầu của tôi hay không, nói từ gói java.lang. *, Apache commons, v.v.

yc

Trả lời

7

Trừ khi bạn thực sự gặp sự cố về hiệu suất (và đã truy tìm chúng đối với mã này), tôi sẽ không lo lắng về điều đó.

Và trước khi tôi cố gắng thay thế Bản đồ, tôi sẽ xem xét lý do tại sao, chính xác, tôi cần thực hiện 4000 lần tra cứu (200 mục 20 đọc mỗi lần) để tạo trang web.

Nhưng tại một cá cược tôi đoán rằng thời gian để thực hiện 4000 lần tra cứu đó sẽ trở nên không đáng kể so với các phần khác của quy trình.

+0

Lý do có thể là một số loại Excel thingamajigger trực tuyến và có mã di sản khó chịu đằng sau nó. HashMap là cực kỳ nhanh chóng mặc dù (ConcurrentHashMap thậm chí còn nhanh hơn!) Và nếu bản đồ được gọi là 4000 lần cho mỗi yêu cầu, JIT sẽ reoptimize nó đến mức tối đa của nó trên bay anyway. – Esko

+0

@Esko ConcurrentHashMap có nhanh hơn không? Nó sử dụng Iterator để đi qua tất cả khóa-giá trị so với hash + index của HashMap. yc – yclian

2

Nếu tất cả các viết được thực hiện trước khi bất kỳ lần đọc sau đó bạn có thể sử dụng phương pháp Collectons.unmodifiableMap.

Nếu đó không phải là trường hợp sau đó viết code để làm những gì bạn muốn không phải là terribly khó khăn (đi lang thang để tìm ra bài mà có mã cơ bản trong nó ...)

Hmm ... chỉ để chắc chắn rằng câu hỏi là những gì tôi đang suy nghĩ ... là khía cạnh chỉ đọc phần quan trọng hoặc đang cố gắng truy cập dữ liệu nhanh một phần quan trọng nhất?

Chỉnh sửa: (dựa trên nhận xét)

Bạn đã kiểm tra để xem, với một hồ sơ nếu mã chậm? Nếu không thì bạn không nên lo lắng về nó.

+0

Cảm ơn câu trả lời. Cái sau (đọc nhiều) quan trọng hơn. Lý do tại sao tôi đã đề cập đến chỉ đọc, bởi vì tôi đã suy nghĩ nếu băm/lập chỉ mục bằng cách nào đó có thể được cải thiện do điều này. yc – yclian

+0

Bản đồ không thể sửa đổi chỉ là một trình bao bọc xung quanh bản đồ cơ bản; nó sẽ thực sự làm tổn thương hiệu suất để bổ sung thêm mức độ ủy quyền này. – erickson

+0

có, do đó câu hỏi của tôi về nếu chỉ đọc quan trọng hơn thì tốc độ và yêu cầu nếu mã đã được lược tả và được gọi là chậm :-) – TofuBeer

1

Nếu điều này thực sự là một nút cổ chai, tôi sẽ xem xét thay đổi kích thước bản đồ để tránh va chạm.

0

Nếu bạn viết đúng vào đầu, trước khi người đọc bắt đầu, vì vậy việc đồng bộ hóa và chia sẻ qua các chủ đề không phải là vấn đề ... HashMap là bạn của bạn. Khi bạn không chắc chắn về điều đó: ConcurrentHashMap.

Cả hai cách triển khai đều là một phần của JDK.

0

Cách đây vài năm (như một dự án trường học), tôi đã thực hiện trong C bản đồ đọc nhiều lần (và các bộ sưu tập khác) đã lấy một bộ sưu tập hiện có, và sau đó "đóng dấu" bằng cách tạo ra nhiều bộ nhớ hơn và biểu diễn hiệu suất bộ nhớ cache (ví dụ: biểu đồ được lưu trữ dưới dạng mảng được tối ưu hóa). Chúng tôi thấy sự khác biệt về hiệu suất tuyệt vời.

Vì Java hỗ trợ giao diện, việc thực hiện một cái gì đó như thế này có thể dễ dàng hơn nhiều (và thực tế được khuyến khích) nhưng tôi không quen với việc triển khai ngoài hộp.

1

Nếu nó thực sự đáng giá, bạn có thể thử perfect hashing. Tuy nhiên, tôi không quen thuộc với bất kỳ triển khai Java nào.

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