Tệp nhanh I/O ít hơn về các cuộc gọi API cụ thể mà bạn thực hiện, mà là cách bạn kiến trúc ứng dụng hoạt động với I/O.
Nếu bạn đang thực hiện tất cả các I/O hoạt động trên một chủ đề duy nhất một cách tuần tự, ví dụ
- đọc block vào bộ nhớ
- Process khối trong bộ nhớ bằng cách nào đó
- Viết khối ra nộp
- Lặp lại cho đến khi thực hiện ...
bạn đang bottlenecking I/O băng thông của hệ thống trong proces hát vòng lặp của một sợi đơn. Một thay thế, nhưng thiết kế phức tạp hơn là đa luồng ứng dụng của bạn để tối đa hóa thông lượng và tránh thời gian chờ đợi. Điều này cho phép hệ thống tận dụng đồng thời cả băng thông bộ điều khiển CPU và I/O. Một thiết kế điển hình cho điều này sẽ giống như thế:
- Một (hoặc hơn) đề người lao động đọc dữ liệu từ đĩa và thêm chúng vào một hàng đợi đầu vào chia sẻ
- Một (hoặc hơn) đề người lao động đọc blocks from the chia sẻ hàng đợi đầu vào, xử lý chúng và thêm chúng vào hàng đợi đầu ra được chia sẻ
- Một (hoặc nhiều) chuỗi công việc đọc được xử lý bị chặn từ hàng đợi đầu ra được chia sẻ và ghi chúng vào tệp đầu ra thích hợp.
Đây không phải là một kiến trúc dễ dàng để thiết kế đúng và đòi hỏi một chút suy nghĩ để tránh tạo ra sự tranh cãi trong bộ nhớ, hoặc áp đảo hệ thống với yêu cầu I/O đồng thời. Bạn cũng cần phải cung cấp siêu dữ liệu kiểm soát để trạng thái xử lý đầu ra không được quản lý trên ngăn xếp cuộc gọi của một luồng mà là trong hàng đợi công việc đầu vào/đầu ra. Bạn cũng phải đảm bảo rằng bạn chuyển đổi và viết đầu ra theo đúng thứ tự, vì với I/O đa luồng, bạn không thể chắc chắn công việc được đặt trên hàng đợi đầu vào theo thứ tự được bảo đảm. Nó phức tạp - nhưng có thể, và nó có thể có sự khác biệt đáng kể về thông lượng qua một cách tiếp cận nối tiếp.
Nếu bạn thực sự có thời gian và muốn nén từng ounce hiệu suất từ hệ thống, bạn cũng có thể sử dụng I/O completion ports - một API mức tương đối thấp - để tối đa hóa thông lượng.
Chúc may mắn.
Tôi không thấy lý do tại sao các cuộc gọi WinAPI phải nhanh hơn các lớp .NET - sau khi tất cả, sau này sử dụng nội bộ trước đó. Bên cạnh đó, một tập tin ánh xạ bộ nhớ (http://en.wikipedia.org/wiki/Memory_mapped_file) có phù hợp không? – Noldorin
Tại sao Dot.net có nhiều cách để ghi vào một tập tin? Đọc và ghi các tập tin là khá cơ bản và nó không có ý nghĩa trong việc có một "nhanh" và "chậm" hình thức - như không ai sẽ sử dụng phiên bản "chậm" cho cả hai đều có cùng mục tiêu. –
Trong vòng nửa giờ, tôi có thể thiết lập thử nghiệm so sánh các hoạt động của tệp .net (có thể là một phần của câu hỏi) và một ứng dụng gốc với IO chuyên sâu (như QuickPAR) sẽ thổi các cửa ra khỏi .NET. ứng dụng. Đó là điểm của câu hỏi - Làm thế nào để bạn đạt được thông lượng đĩa tối ưu trong .NET? – Will