Ukuran buffer optimal terkait dengan sejumlah hal: ukuran blok sistem file, ukuran cache CPU, dan latensi cache.
Sebagian besar sistem file dikonfigurasikan untuk menggunakan ukuran blok 4096 atau 8192. Secara teori, jika Anda mengkonfigurasi ukuran buffer sehingga Anda membaca beberapa byte lebih banyak daripada blok disk, operasi dengan sistem file bisa sangat tidak efisien (yaitu jika Anda mengkonfigurasi buffer Anda untuk membaca 4100 byte pada suatu waktu, setiap pembacaan akan membutuhkan 2 blok yang dibaca oleh sistem file). Jika blok sudah dalam cache, maka Anda akhirnya membayar harga RAM -> L3 / L2 cache latency. Jika Anda kurang beruntung dan blok belum ada dalam cache, Anda membayar harga latensi disk-> RAM juga.
Inilah sebabnya mengapa Anda melihat sebagian besar buffer berukuran sebagai kekuatan 2, dan umumnya lebih besar dari (atau sama dengan) ukuran blok disk. Ini berarti bahwa salah satu aliran Anda membaca dapat menghasilkan banyak pembacaan blok disk - tetapi pembacaan tersebut akan selalu menggunakan blok penuh - tidak ada pembacaan yang sia-sia.
Sekarang, ini diimbangi sedikit dalam skenario streaming yang khas karena blok yang dibaca dari disk akan tetap berada di memori ketika Anda menekan membaca berikutnya (setelah semua, kami melakukan membaca berurutan di sini) - sehingga Anda berakhir membayar RAM -> L3 / L2 harga latensi cache pada bacaan berikutnya, tetapi bukan disk-> RAM latensi. Dalam hal urutan besarnya, disk-> RAM latensi sangat lambat sehingga cukup banyak menggantikan latensi lain yang mungkin Anda hadapi.
Jadi, saya menduga bahwa jika Anda menjalankan tes dengan ukuran cache yang berbeda (belum melakukannya sendiri), Anda mungkin akan menemukan dampak besar ukuran cache hingga ukuran blok sistem file. Di atas itu, saya curiga bahwa segala sesuatunya akan naik dengan cepat.
Ada satu ton kondisi dan pengecualian di sini - kompleksitas sistem sebenarnya cukup mengejutkan (hanya menangani L3 -> L2 cache transfer sangat membingungkan, dan itu berubah dengan setiap jenis CPU).
Ini mengarah ke jawaban 'dunia nyata': Jika aplikasi Anda seperti 99% di luar sana, atur ukuran cache ke 8192 dan lanjutkan (bahkan lebih baik, pilih enkapsulasi daripada kinerja dan gunakan BufferedInputStream untuk menyembunyikan detail). Jika Anda berada dalam 1% aplikasi yang sangat bergantung pada throughput disk, buat implementasi Anda sehingga Anda dapat menukar strategi interaksi disk yang berbeda, dan memberikan kenop dan tombol untuk memungkinkan pengguna Anda menguji dan mengoptimalkan (atau menghasilkan beberapa sistem optimalisasi diri).