ファイルIO(C言語)とそのパフォーマンスの問題について質問があります。
私は多くのファイルI/Oを実行するアプリケーションを持っています(その存続期間中、主にファイル出力の約3〜6時間、約0.5〜0.75TB)。現時点では、私のアプリケーションはsprintf()
すべてをchar文字列に、行の終わりにwrite()
sをfile_descriptorに変換します。私の文字列の長さは1024文字ですが、64から1024までさまざまです。とにかく。
問題は次のとおりです。 より大きなchar文字列(たとえば、1MB)とすべてを
作成してから実行する方が理にかなっていますか?または、バッファリングがによって処理されると仮定して、ファイルに完全かつ単純に直接スキップする方が理にかなっていますか?sprintf()
write()
sprintf()
write()
write()
私が考えたものですが、パフォーマンスの点で実際に何かを達成できるか
どうかはわかりません。文字列、数値、文字列の個々の部分を格納し、代わりに構造のmem_copyを実行する構造がある場合はどうなりますか?バイナリ書き込みに似ていると思いますか?
「バッファリングされた」アプローチ、またはパフォーマンスを最大化するものを実現しようとしています。後者は、さらに処理するためにそのファイルを使用する必要があるということです。助言がありますか?
編集
私はいくつかの簡単なパフォーマンス比較を行いましたprintf(); + redir
、そしてsprintf(); write();
私は単にファイルに〜20GBをコピーしています。
char string[1024];
for(i=0;i<(1<<20)*20;i++)
printf("%s",string);
~/tmp/tests$ time ./printf.out > testing
real 2m22.101s
user 0m28.214s
sys 0m29.294s
とは対照的に:
char string14[256]; ...etc
for(i=0;1<<(1<<20)*20;i++){
sprintf(dst_string,"%s%s",dst_string, string14);
sprintf(dst_string,"%s%s",dst_string, string24);
sprintf(dst_string,"%s%s",dst_string, string34);
sprintf(dst_string,"%s%s",dst_string, string44);
write(fd, dst_string, 1024);
}
~/tmp/tests$ time ./write.out
real 1m48.206s
user 0m58.544s
sys 0m41.079s
複数のsprintf()を使用する理由は、コピー->バッファをシミュレートしてから、バッファを書き込むためです。時間(とにかく実際)は、いくつかのコメントが示唆するほど重要ではありません。確かに、これは単純な例であり、おそらく計算+ IOのスキームでは、そうではないかもしれません。
printfの例で少し混乱していることですが、その余分な時間はどこに行きましたか?user + sysは実際には加算されません、少なくとも彼らは球場にいるべきではありませんか?全部で1時30分足りないから。
このテストは何か結論を示していますか?sprintf +write>単にprint+redir?
とにかく、コメントありがとうございます。