fread / fwriteの最適なバッファーサイズ[終了]


10

POSIXのfread / fwrite関数を介した読み取り/書き込みファイルには、どのバッファーサイズを選択すればよいですか?

c 

この質問はローカライズされすぎています。現時点でコーディングしている特定のプログラムにのみ関係します。
ワールドエンジニア

私は一般的なケースを意味します。多くのプログラムは、非常に不明なサイズ(grep、などcp)のファイル全体を読み書きする必要があります

あなたは、POSIX意味するかread/ write機能またはANSI / ISO / IEC fread/ fwrite機能を?
Jan Hudec、2012年

回答:


6

ANSI / ISO fread/fwrite関数はバッファリングされます。バッファは通常8 KiBであり、これにより、コードで使用するものに依存しない細分性が得​​られます。バッファを、おそらく以下の値まで少し増やすことが理にかなっているかもしれません。一括転送の場合、余分なコピーがあるため、常に少し遅くなります。

POSIX read/write関数の場合、オペレーティングシステムやデバイスなどの多くの要素に依存しますが、実際の経験では、数十KiBを超えてバッファーを増やしてもパフォーマンスは向上しないため、32または64 KiBがほぼ適切です。

一部のシステムでは、依存関係が他のシステムよりも大きくなっています。Linuxの場合、差は通常8 KiBを超えると最小になります(デフォルトのバッファーは問題ありません)。たとえば、Windows CE(ネイティブAPIを使用。POSIXを使用しない)では、64 KiBを超えても問題は解決します。デバイスによって異なる場合もあります。


バッファI / O(つまりfreadfwrite)の場合は8k、バッファなしの場合は32 / 64Kですか?画像データを送信する場合、バッファ付きまたはバッファなしを選択する特定の根拠はありますか?
Francesco Boi

1
@ FrancescoBoi、8kは変更可能なbufferedのデフォルトのみです。バッファリングのポイントは、一度に数バイトを処理するときにすべてのコンテキストスイッチを回避することです。通常、画像のすべてが必要であるか、またはそれを使用している場合、少しの処理をスキップするため、バッファなしの方が適しています。
Jan Hudec
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.