Оптимальний розмір буфера пов'язаний із низкою речей: розмір блоку файлової системи, розмір кешу CPU та затримка кешу.
Більшість файлових систем налаштовані на використання розмірів блоків 4096 або 8192. Теоретично, якщо ви налаштуєте розмір буфера, щоб ви читали на кілька байт більше, ніж блок диска, операції з файловою системою можуть бути вкрай неефективними (тобто якщо ви налаштував ваш буфер для зчитування одночасно 4100 байт, кожне зчитування вимагатиме 2-х блочних читання файловою системою). Якщо блоки вже в кеш-пам'яті, ви закінчите платити ціну оперативної пам'яті -> L3 / L2 затримки кешу. Якщо вам не пощастило і блоки ще не знаходяться в кеші, ви також платите ціну затримки диска-> ОЗУ.
Ось чому ви бачите більшість буферів розміром із потужністю 2 і, як правило, більше (або дорівнює) розміру блоку диска. Це означає, що одне з прочитаних потоків може призвести до читання декількох блоків диска, але вони завжди використовуватимуть повний блок - не зчитуйте їх.
Тепер це компенсується досить типовим сценарієм потокового потоку, тому що блок, який зчитується з диска, все ще залишиться в пам’яті, коли ви натиснете наступне читання (ми робимо послідовне читання тут, зрештою) - так ви закінчите оплата оперативної пам'яті -> затримка кеш-пам’яті L3 / L2 при наступному прочитанні, але не затримка диска-> ОЗУ. Щодо порядку розміру, то затримка оперативної пам’яті на диску •> ОЗУ настільки повільна, що вона значною мірою перекриває будь-які інші затримки, з якими ви можете мати справу.
Отже, я підозрюю, що якщо ви провели тест з різними розмірами кешу (не робили цього самостійно), ви, мабуть, знайдете великий вплив розміру кешу аж до розміру блоку файлової системи. Над цим я підозрюю, що все вирівняється досить швидко.
Є ціла тонна умов і винятків тут - складність системи насправді досить приголомшлива (просто отримати ручку на L3 -> передає кеш L2 розум запаморочливо складний, і він змінюється з кожним типом процесора).
Це призводить до відповіді "реального світу": Якщо у вашому додатку приблизно 99%, встановіть розмір кешу на 8192 та перейдіть далі (ще краще, виберіть інкапсуляцію над продуктивністю та використовуйте BufferedInputStream, щоб приховати деталі). Якщо у вас є 1% додатків, які сильно залежать від пропускної здатності диска, створіть свою реалізацію, щоб ви могли обмінятися різними стратегіями взаємодії з дисками, а також забезпечити ручки та циферблати, щоб ваші користувачі могли протестувати та оптимізувати (або запропонувати деякі самооптимізуюча система).