Sự tò mò và hiệu quả là những lý do cho câu hỏi này. Tôi đang ở một tình huống mà tôi đang tạo ra nhiều HashSets mới sau vòng nhất định chạy:Hiệu quả bộ nhớ của việc xóa một HashSet so với việc tạo một HashSet mới
Các HashSet hiện được khai báo như vậy ở phía trên cùng của lớp:
private Set<String> failedTests;
Rồi sau này trong mã, tôi chỉ tạo một failTests mới HashSet bất cứ khi nào tôi chạy lại các thử nghiệm:
failedTests = new HashSet<String>(16384);
Tôi thực hiện việc này lặp đi lặp lại, tùy thuộc vào kích thước của phép thử. Tôi hy vọng bộ thu gom rác sẽ xử lý hiệu quả nhất dữ liệu cũ. Nhưng, tôi biết một tùy chọn khác sẽ là tạo HashSet ban đầu ngay từ đầu:
private Set<String> failedTests = new HashSet<String>(16384);
và sau đó xóa HashSet mỗi lần qua vòng lặp.
failedTests.clear();
Câu hỏi của tôi là cách hiệu quả nhất để làm điều này về chi phí, v.v ... là gì? Tôi không biết chức năng rõ ràng() đang làm gì bên trong - là nó làm điều tương tự, gửi dữ liệu cũ đến bộ sưu tập rác, hay nó đang làm một cái gì đó thậm chí còn hiệu quả hơn? Ngoài ra, tôi cung cấp cho HashSet một dung lượng lớn dung lượng ban đầu, nhưng nếu một bài kiểm tra yêu cầu nhiều hơn 2^14 phần tử, thì hàm .clear()
có thể tái khởi tạo HashSet thành 16384 không?
Để thêm, tôi đã tìm thấy source code to clear() here. Vì vậy, nó ít nhất là một hoạt động O (n) của trường hợp xấu nhất.
Sử dụng chức năng rõ ràng, tôi đã thực hiện một quá trình thử nghiệm hoàn tất sau 565 giây. Sử dụng GC để xử lý nó, kiểm tra kết thúc sau 506 giây.
Nhưng không phải là điểm chuẩn hoàn hảo vì có các yếu tố bên ngoài khác như giao tiếp với hệ thống tệp của máy tính và mạng. Nhưng một phút đầy đủ cảm thấy khá tốt thực sự. Có ai đề nghị một hệ thống hồ sơ cụ thể mà sẽ làm việc trên mức độ dòng/phương pháp? (Tôi đang sử dụng Eclipse Indigo)
Bạn đã thử điểm chuẩn chưa? – rob
Bạn có bất kỳ biện pháp nào về cách tạo * nhiều * bộ mới? Bạn có thực sự kiểm tra hành vi của ứng dụng của bạn không? Đó là trường hợp của câu hỏi * bộ nhớ so với hiệu suất * thường dẫn đến tối ưu hóa sớm. Là một cơ sở, bạn có thể tạo một 'HashSet' mới, cho phép GC thực hiện công việc của mình và làm một chút lược tả để xem thời gian thực trước khi đáng lo ngại. Sau khi tất cả, phương pháp 'clear' liên quan đến một iteration, nulling references và cho phép GC thực hiện công việc của mình. – Gamb
có thể trùng lặp của [Cách nhanh nhất để tạo lại ArrayList trong vòng lặp for] (http://stackoverflow.com/questions/11740013/fastest-way-to-recreate-the-arraylist-in-a-for-loop): 'new' thường nhanh hơn' clear'. – assylias