Fread / fwrite için en uygun tampon boyutu [kapalı]


10

POSIX fread / fwrite işlevleriyle okuma / yazma dosyaları için hangi arabellek boyutunu seçmeliyim?

c 

Bu soru çok yerel. Sadece şu anda kodladığınız belirli bir programla ilgilidir.
Dünya Mühendisi

Genel durum demek istiyorum. Birçok program okumaya ihtiyaçları / çok bilinmeyen boyut (gibi olan bütün dosyaları yazma grep, cp)

POSIX read/ writefonksiyonlar veya ANSI / ISO / IEC fread/ fwritefonksiyonlar mı demek istediniz ?
Jan Hudec

Yanıtlar:


6

ANSI / ISO fread/fwriteişlevleri arabelleğe alınır. Tampon genellikle 8 KiB'dir ve kodunuzda kullandığınızdan bağımsız olarak ayrıntı düzeyi verir. Tamponu biraz artırmak, belki de aşağıdaki değere getirmek mantıklı olabilir. Toplu transfer için, ekstra kopyalar nedeniyle her zaman biraz daha yavaş olacaktır.

POSIX read/writeişlevleri için işletim sistemine ve cihaza ve diğer birçok şeye bağlıdır, ancak pratik deneyim, tamponu onlarca KiB'nin ötesine yükselterek herhangi bir performans iyileştirmesi elde etmemenizdir, bu nedenle 32 veya 64 KiB doğru.

Bazı sistemlerde bağımlılık diğerlerinden daha büyüktür. Linux'ta fark genellikle 8 KiB'ın üzerinde minimumdur (bu nedenle varsayılan arabellek iyidir), örneğin Windows CE'de (yerel API kullanarak; POSIX'leri yoktur) 64 KiB'den bile büyük olsa da yardımcı olur. Ayrıca aygıta da bağlı olabilir.


böylece 8k tamponlu I / O (yani için fread, fwrite) ve tamponsuz 32/64 K? Görüntü verileri gönderiliyorsa, arabelleğe alınmış veya arabelleğe alınmamayı seçmek için belirli bir gerekçe var mı?
Francesco Boi

1
@FrancescoBoi, 8k yalnızca değiştirebileceğiniz arabellek için varsayılan değerdir. Arabelleğe almanın amacı, bir seferde birkaç bayt işlerken tüm bağlam anahtarlarından kaçınmaktır. Görüntü için genellikle hepsine ihtiyacınız vardır veya sahip olursunuz ve daha sonra arabelleğe alma işlemi biraz işlemden geçtiği için daha iyidir.
Jan Hudec
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.