Tôi vừa mới gặp một lý do khác, không ngờ đến khi sử dụng AsynchronousFileChannel. Khi thực hiện ghi theo định hướng ngẫu nhiên trên các tệp lớn (vượt quá bộ nhớ vật lý để bộ nhớ đệm không hỗ trợ mọi thứ) trên NTFS, tôi thấy rằng AsynchronousFileChannel thực hiện gấp đôi hoạt động, trong chế độ một luồng, so với một FileChannel bình thường. Dự đoán tốt nhất của tôi là vì io không đồng bộ sôi xuống IO chồng lên nhau trong Windows 7, trình điều khiển hệ thống tệp NTFS có thể cập nhật cấu trúc nội bộ của chính nó nhanh hơn khi không phải tạo điểm đồng bộ sau mỗi cuộc gọi .
tôi vi benchmarked chống RandomAccessFile để xem làm thế nào nó sẽ thực hiện (kết quả rất gần với FileChannel, và vẫn còn một nửa số hiệu suất của AsynchronousFileChannel.
Không chắc điều gì xảy ra với đa luồng viết. Đây là trên Java 7, trên một SSD (SSD là một đơn đặt hàng của cường độ nhanh hơn từ tính, và một thứ tự cường độ nhanh hơn trên các tập tin nhỏ hơn phù hợp với bộ nhớ)
Sẽ rất thú vị để xem nếu tỷ lệ tương tự giữ trên Linux.
Nguồn
2012-02-15 06:35:59
Cảm ơn, nhưng tôi đã tự hỏi thêm về những lý do hiệu quả - Tôi không thể hiểu tại sao thực hiện I/O trong một chủ đề khác giúp. Một luồng luôn phải chặn cho I/O và không có tài nguyên được báo cáo lại, sử dụng tính năng phần cứng hoặc bất kỳ hành vi nâng cao hiệu suất nào khác. –
Lợi thế của việc này là bạn * không * cần hai chủ đề. Nếu bạn đang viết một blob lớn dữ liệu, ở mức thấp, bộ điều khiển đĩa thực hiện công việc ghi dữ liệu vào đĩa trước khi báo hiệu một ngắt làm tăng stack để gọi trình xử lý hoàn thành của bạn. Chủ đề của bạn không cần chặn trong quá trình này và có thể thực hiện các nội dung khác. Bạn sử dụng một chuỗi ít hơn, trình quản lý chuỗi chỉ quản lý một chuỗi ít hơn, bạn không cần sử dụng thông báo java. Về cơ bản, bạn sử dụng ít tài nguyên hơn để làm điều tương tự. – lenkite
Hệ điều hành cũng có thể tối ưu hóa thứ tự các hoạt động IO không đồng bộ được thực hiện. Ví dụ: nếu bạn có nhiều lần đọc của nhiều vùng trong tệp được thực hiện không đồng bộ, hệ điều hành có thể nhóm chúng lại với nhau thành lần đọc tuần tự mà không phải lo lắng về việc thực hiện tất cả các thao tác theo thứ tự chính xác. –