0

私は非常に大きなメモリを持っており、それぞれをvector<string>に書き込みたいのですが、その方法は次のとおりです。string./log.txt

ofstream ofs("./log.txt");
for (vector<string>::const_iterator cit = vec.begin(); cit != vec.end(); cit++) {
    char buf[30];
    sprintf(buf, "%s\t---@\n", cit->c_str());
    ofs << buf;
}
ofs.close();

ディスク I/O 時間が気になりますが、効率的ですか? もっと良いアイデアはありますか?

4

3 に答える 3

2

これは、実際には何もフォーマットする必要がないという事実を利用したハイブリッドアイデアです。

 for ( /* as you have */ )
 {
     ofs.write(cit->c_str(), cit->size());
     ofs.write("\t---@", 5);
 }
于 2012-07-31T08:56:45.213 に答える
1

C迂回は使用しないでください。明白なことを試してください

ofs << *cit << "\t---@\n";

これは、現在持っているものよりも速いはずです。合理的な手動の調整で、ライブラリが実行するよりも速くなるとは思えません。上記があなたのコードよりも速いと仮定できる理由:

  • フォーマット文字列の解析なし
  • 一時バッファにコピーしません
  • はその長さを知っている'\0'ので、終了を探す必要はありませんstd::string

最後の点はまだ当てはまり"\t---@\n"ません。std::stringこれを同様に変換して、パフォーマンスを少しだけ向上させることもできます。「純粋なC++」コードが優れている理由は他にもあります。

  • バッファオーバーランの危険はありません
  • '\0'データに埋め込まれた文字に問題はありません

ofstreamはバッファリングされるため、ディスクI/Oは問題になりません。したがって、実装は、これらの文字列を一度にファイルに書き込む前に、これらの文字列の数をメモリに収集します。それでも、それらはおそらくオペレーティングシステムによって管理されるキャッシュに保存され、さらに大きなハンクを蓄積します。したがって、ディスクには大量の書き込みがほとんど表示されないはずです。これは非常に効率的です。

于 2012-07-31T09:01:55.047 に答える
0

これが効率的かどうかは、コードよりも ofstream の実装に依存します。これが本来あるべき姿です。より効率的なオブストリームが必要な場合は、実装できます。

ただし、他の人が指摘しているように、あなたのコードは安全ではありません。代わりに、C++ ストリーム演算子またはメソッドを使用する必要があります。

于 2012-07-31T09:08:38.513 に答える