0

完了するまでに最大 3 ~ 4 時間かかるプログラムがあります。進行中、さまざまな情報を一般的なファイル「info.txt」に出力する必要があります。ここに私が現在それを行う方法があります

char dateStr [9];
char timeStr [9];
_strdate(dateStr);
_strtime(timeStr);

ofstream infoFile("info.txt", ios::out);
infoFile << "foo @ " << timeStr << " , " << dateStr << endl;
infoFile.close();

これを 1 回の実行で 5 回行います。私の質問は次のとおりです。

  1. 出力ごとに infoFile を閉じます (したがって、出力ごとに 1 つずつ、infoFile1、infoFile2、...、infoFile5 の 5 つのストリームを使用します)。
  2. または「infoFile」を使用するためだけに、実行中に開いたままにしますか?

編集:「1回の実行」とは、プログラムの1回の実行を意味します。したがって、「1 回の実行で 5 回」とは、プログラムを 1 回実行したときに info.txt に何かを出力することを意味します (3 ~ 4 時間かかります)。

4

3 に答える 3

3

初め; 最適化する前に数値を取得し、プロファイラーを使用します。そうすれば、どの部分が最も時間がかかるかがわかります。プロファイラーがない場合は、何かを行う前に少し考えてください。この 3 ~ 4 時間の間に何回走りますか? 1 回の実行で 1 回しか発生しないことがほとんどない場合は、おそらく最適化の対象として適している可能性が低くなります。実行が非常に多い場合は、ディスク アクセスがかなり遅くなる可能性があるため、これらの部分も考慮することができます。

そうは言っても、以前のプロジェクトでは、ストリームを開いたり閉じたりする代わりに再利用することで、少し時間を節約しました。

于 2013-02-13T13:38:43.003 に答える
2

あなたがやろうとしていることは本当に明確ではありません。あなたが投稿したコードがあなたが望むものであれば、それは確かに最良の解決策です。値を追加したい場合は、ファイルを開いたままにしておくことをお勧めします。

その他の考慮事項:

  • ファイルを閉じるか、データをフラッシュしない限り、外部プログラムはデータをすぐに認識できない場合があります。

  • ファイルを開くと、その名前の既存のファイルは切り捨てられます。この瞬間にファイルを読み込もうとする外部プログラムは何も認識しません。

  • 各出力の後にフラッシュし ( を使用する場合は自動std::endl)、各出力の前に先頭にシークすると、前の問題は解決されます (そして、データが見かけほど小さい場合、書き込みはアトミックになります) が、誤解を招くデータになる可能性があります。書き込まれた値の長さが異なる場合---ファイルの長さは短くなり ません。(おそらくここでは当てはまりませんが、考慮すべきことです。)

パフォーマンスに関しては、最大で数ミリ秒続き、1 時間に 1 回か 2 回実行される操作について話しています。1ミリ秒かかるか10ミリ秒かかるかはまったく関係ありません。

于 2013-02-13T14:57:50.403 に答える
0

これは時期尚早な最適化の明確なケースです

これは、数時間の間に 5 回しか発生しないため、どのアプローチを採用しても、アプリケーションのパフォーマンスに実際の違いはありません。

前の回答が示唆したようにアプリケーションをプロファイリングし、それを使用してコード内の本当のボトルネックを特定ます。

info.txtアプリケーションのランタイムの範囲内で が削除/編集されないようにしたい場合にのみ、それが問題になると思います。その場合、ストリームを存続させたいと思うでしょう。そうでなければ、それは問題ではありません。

于 2013-02-13T14:58:21.637 に答える