どのように...printf自体がwriteを呼び出すという事実で、これは可能ですか?足りないものはありますか?
はい、足りないものがあります。毎回printf
呼び出すとは限りません。むしろ、その出力をバッファリングします。つまり、多くの場合、結果をメモリバッファに格納し、バッファがいっぱいになったとき、またはその他の条件でのみ呼び出します。write
printf
write
write
はかなり高価な呼び出しであり、データをのバッファにコピーするよりもはるかに高価でprintf
あるため、呼び出しの数を減らすとwrite
、正味のパフォーマンスが向上します。
stdoutが端末デバイスに送信されている場合は、-が表示されるたびにprintf
呼び出します。この場合、呼び出されるたびに呼び出します。stdoutがファイル(またはに)に向けられている場合、内部バッファがいっぱいになったときにのみwriteを呼び出します。write
\n
/dev/null
printf
出力をリダイレクトしていて、その内部バッファが4Kバイトであるとすると、最初のループは3000000 /(printf
4096/12)==8780回呼び出します。write
ただし、2番目のループはwrite
3000000回呼び出します。
への呼び出しが少ないという効果を超えて、への呼び出しwrite
のサイズwrite
があります。ハードドライブのストレージの量はセクターであり、多くの場合512バイトです。セクターよりも少量のデータを書き込むには、セクター内の元のデータを読み取り、それを変更して、結果を書き戻す必要があります。write
ただし、元のデータを読み込む必要がないため、完全なセクターでの呼び出しは高速になる可能性があります 。printf
のバッファサイズは、通常のセクターサイズの倍数になるように選択されます。これにより、システムは最も効率的にデータをディスクに書き込むことができます。
最初のループは2番目のループよりもはるかに速く進むと思います。