5


ファイル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?

とにかく、コメントありがとうございます。

4

1 に答える 1

6

自分のマシンでテストを行ったところ、それほど近代的ではないハードウェアから約60MB/秒が得られました。これは、3.6GB/分または216GB/時間です(したがって、3時間で約640GBが生成されます)。アプリケーションで費やされる時間のほとんどは「ディスクの待機」であると思います。その場合、使用するIOメソッドにまったく違いはありません。

しかし、すべてのパフォーマンスに関する質問と同様に、インターネットで質問したり、本で調べたりすることで見つけることができる答えではありません。懸念しているシステムで測定する必要があります。私の古いハードディスクを適切に構成されたRAIDに変更すると、パフォーマンスが大幅に向上します[適切な種類のRAIDシステムの場合、アクセスを高速化することではなく信頼性を確保することを目的としているため、個々のディスクよりも低速なものもあります。 ]。

いくつかの比較を行うこともできます。1。ソフトウェアの出力を/dev/nullにリダイレクトします-コードの実行にかかる時間を今すぐ確認します。ファイルに書き込むときよりも10〜100倍高速である場合は、現在の書き込み方法やその他の方法でまったく違いがないことがわかります。2. dd if=/dev/zero of=yourfile bs=4k count=largenumber(largenumber * 4KB =通常のファイルサイズ)を使用して同様のサイズのファイルを作成します。アプリケーションが複数のファイルを書き込んでいる場合は、そのようないくつかの異なるファイルを書き込むスクリプトを記述します。それがアプリケーションよりもはるかに高速である場合は、アプリケーションからの出力方法を変更することで得られるものがあります。

上記の2つのいずれかが利益の可能性があることを示している場合は、アプリケーションを機能させるのと同じ方法で大量の出力を生成するベンチマークを作成し、何が違いを生むかを確認します。ぜひここに戻って質問してください。しかし、私の推測では、出力メカニズムについて何をしても、アプリケーションの実行速度は速くも遅くもなりません。これは、すべて「ディスクの書き込み速度」にかかっているためです。

于 2013-01-31T16:36:12.487 に答える