Ukuran buffer optimal untuk fread / fwrite [tertutup]

10

Berapa ukuran buffer yang harus saya pilih untuk membaca / menulis file melalui fungsi POSIX fread / fwrite?


sumber
Pertanyaan ini terlalu terlokalisasi. Ini hanya berkaitan dengan program khusus apa pun yang Anda koding saat ini.
Insinyur Dunia
Maksud saya kasus umum. Banyak program perlu membaca / menulis seluruh file dengan ukuran yang sangat tidak diketahui (seperti grep, cp)
Apakah maksud Anda fungsi POSIX read/ writefungsi atau ANSI / ISO / IEC fread/ fwrite?
Jan Hudec

Jawaban:

6

Fungsi ANSI / ISO fread/fwritedilindungi. Buffer biasanya 8 KiB dan itu memberikan granularity independen dari apa yang Anda gunakan dalam kode Anda. Mungkin masuk akal untuk meningkatkan buffer sedikit, mungkin dengan nilai di bawah ini. Untuk transfer massal mereka akan selalu sedikit lebih lambat karena salinan tambahan.

Untuk read/writefungsi POSIX itu tergantung pada sistem operasi dan perangkat dan banyak hal lainnya, tetapi pengalaman praktis adalah bahwa Anda tidak mendapatkan peningkatan kinerja dengan meningkatkan buffer melebihi puluhan KiB, sehingga 32 atau 64 KiB hampir tepat.

Pada beberapa sistem ketergantungan lebih besar daripada yang lain. Di Linux perbedaan biasanya minimal di atas 8 KiB (jadi buffer default baik-baik saja), misalnya pada Windows CE (menggunakan API asli; mereka tidak memiliki POSIX) bahkan lebih besar dari 64 KiB masih membantu. Mungkin juga tergantung pada perangkat.

Jan Hudec
sumber
jadi 8k untuk buffered I / O (ie fread, fwrite) dan 32 / 64K untuk unbuffered? Jika mengirim data gambar apakah ada alasan khusus untuk memilih buffered atau unbuffered?
Francesco Boi
1
@FrancescoBoi, 8k hanya default untuk buffered yang dapat Anda ubah. Inti dari buffering adalah untuk menghindari semua switch konteks ketika Anda memproses beberapa byte pada suatu waktu. Untuk gambar Anda biasanya perlu atau memiliki semuanya dan kemudian unbuffered lebih baik karena melompati sedikit pemrosesan.
Jan Hudec