Kích thước bộ đệm tối ưu có liên quan đến một số điều: kích thước khối hệ thống tệp, kích thước bộ đệm CPU và độ trễ bộ đệm.
Hầu hết các hệ thống tệp được định cấu hình để sử dụng kích thước khối 4096 hoặc 8192. Về lý thuyết, nếu bạn định cấu hình kích thước bộ đệm của mình để bạn đọc nhiều hơn một vài byte so với khối đĩa, các hoạt động với hệ thống tệp có thể cực kỳ kém hiệu quả (ví dụ: nếu bạn cấu hình bộ đệm của bạn để đọc 4100 byte mỗi lần, mỗi lần đọc sẽ yêu cầu 2 khối đọc bởi hệ thống tệp). Nếu các khối đã có trong bộ đệm, thì bạn sẽ phải trả giá RAM -> độ trễ bộ đệm L3 / L2. Nếu bạn không may mắn và các khối chưa có trong bộ đệm, bạn cũng phải trả giá của đĩa-> độ trễ RAM.
Đây là lý do tại sao bạn thấy hầu hết các bộ đệm có kích thước bằng 2 và thường lớn hơn (hoặc bằng) kích thước khối đĩa. Điều này có nghĩa là một trong những lần đọc luồng của bạn có thể dẫn đến nhiều lần đọc khối đĩa - nhưng những lần đọc đó sẽ luôn sử dụng một khối đầy đủ - không đọc lãng phí.
Bây giờ, điều này được bù đắp khá nhiều trong một kịch bản phát trực tuyến điển hình bởi vì khối được đọc từ đĩa sẽ vẫn còn trong bộ nhớ khi bạn đọc lần đọc tiếp theo (sau tất cả chúng tôi đang đọc tuần tự ở đây) - vì vậy bạn sẽ kết thúc trả RAM -> giá trễ của bộ đệm L3 / L2 cho lần đọc tiếp theo, nhưng không phải là độ trễ của đĩa-> RAM. Về thứ tự độ lớn, độ trễ của đĩa-> RAM chậm đến mức nó có khá nhiều thay đổi so với bất kỳ độ trễ nào khác mà bạn có thể xử lý.
Vì vậy, tôi nghi ngờ rằng nếu bạn đã chạy thử nghiệm với các kích thước bộ đệm khác nhau (chưa thực hiện điều này), bạn có thể sẽ thấy tác động lớn của kích thước bộ đệm lên đến kích thước của khối hệ thống tệp. Trên đó, tôi nghi ngờ rằng mọi thứ sẽ tăng lên khá nhanh.
Có một tấn các điều kiện và các ngoại lệ ở đây - sự phức tạp của hệ thống được thực sự khá loạng choạng (chỉ nhận được một tay cầm trên L3 -> chuyển bộ nhớ cache L2 là tâm bogglingly phức tạp, và nó thay đổi với tất cả các loại CPU).
Điều này dẫn đến câu trả lời 'thế giới thực': Nếu ứng dụng của bạn giống 99% ngoài kia, hãy đặt kích thước bộ đệm thành 8192 và tiếp tục (thậm chí tốt hơn, chọn đóng gói theo hiệu suất và sử dụng BufferedInputStream để ẩn chi tiết). Nếu bạn nằm trong 1% ứng dụng phụ thuộc nhiều vào thông lượng đĩa, hãy tạo ra triển khai của bạn để bạn có thể trao đổi các chiến lược tương tác đĩa khác nhau và cung cấp các nút và quay số để cho phép người dùng của bạn kiểm tra và tối ưu hóa (hoặc đưa ra một số hệ thống tự tối ưu hóa).