Оптимальний розмір буфера для fread / fwrite [закрито]


10

Який розмір буфера я повинен вибрати для читання / запису файлів через POSIX fread / fwrite функції?

c 

Це питання занадто локалізовано. Це стосується лише тієї конкретної програми, яку ви кодуєте на даний момент.
Світовий інженер

Я маю на увазі загальний випадок. У багатьох програмах потрібно читати / записувати цілі файли з дуже невідомим розміром (наприклад grep, cp)

Ви маєте на увазі POSIX read/ writeфункції чи ANSI / ISO / IEC fread/ fwriteфункції?
Ян Худек

Відповіді:


6

Функції ANSI / ISO fread/fwriteбуферизовані. Буфер зазвичай становить 8 KiB, і це надає деталізацію незалежно від того, що ви використовуєте у своєму коді. Можливо, має сенс трохи збільшити буфер, можливо, до значення нижче. Для масової передачі вони завжди будуть трохи меншими, хоча завдяки додатковим копіям.

Для read/writeфункцій POSIX це залежить від операційної системи та пристрою та багатьох інших речей, але практичний досвід полягає в тому, що ви не отримаєте жодного покращення продуктивності, збільшуючи буфер понад десятки KiB, тому 32 або 64 KiB - це вірно.

У деяких системах залежність більша, ніж в інших. У Linux різниця зазвичай мінімальна вище 8 KiB (тому буфер за замовчуванням є нормальним), наприклад, у Windows CE (використовуючи рідний API; у них немає POSIX), навіть більший, ніж 64 KiB, як і раніше. Це також може залежати від пристрою.


так 8k для забуференном введення / виведення (тобто fread, fwrite) і 32 / 64К для небуферізованних? Якщо для надсилання даних зображень існує якесь обґрунтування для вибору буферованого чи небуферованого?
Франческо Бой

1
@FrancescoBoi, 8k є типовим лише для буферизованих, які ви можете змінити. Суть буферизації полягає в тому, щоб уникнути всіх контекстних комутаторів, коли ви обробляєте кілька байтів одночасно. Для зображення вам зазвичай потрібно або все це, а потім розблоковане краще, оскільки воно пропускає трохи обробки.
Ян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.