私はWindowsのMAX_PATH
の制限を超えるファイル名のリストを数日間表示したり、切ったりする問題をハッキングしています。 私は見つけることができるすべてのパッチでVisual Studio 2008を使用しています。タイミングはQueryPerformanceCounterと会社で行います。iostreamsが遅いです。それらをスピードアップする方法はありますか?
最新問題は、次のコードで発生:
start = getTime();
for(vector<wstring>::iterator it = files.begin(); it != files.end(); ++it)
{
#if USE_COUT
wcout << setw(6) << it->length() << L": " << *it << endl; // 1
#else
wstring x(*it);
wprintf(L"%6.6d: %s\n", it->length(), x.c_str()); // 2
#endif
}
stop = getTime();
上記ループは、256文字の平均文字列の長さを有する6755個のエントリを有するベクトル上で動作します。
wcoutで印刷するコードは、上記のループを使用してベクトルを表示するのに約52秒かかります。 wprintfを使用するコードは約1.2秒で印刷されます。
コンソールウィンドウを最小化すると、printfコードは約500ミリ秒で実行されますが、wcoutコードは約40秒かかります。
私は実際に何年もの間、iostreamを好きにしていましたが...私はこのスピードの問題に頭を悩まし続けています。 Borland OS/2コンパイラを使用している1993/1994では、sprintfで約200ミリ秒実行されたstrstreamを使用して実行するのに4〜6時間かかるランタイムで同様の問題が発生しました。
iostreamsについて私の心を変えさせるためのアドバイスはありますか?
編集:
このようなフラッシングのすべての話は私にとって不思議です。
printf
文字列内の
\n
は、機能的には
std::endl
と同じで、両方とも改行とフラッシュが出力に放出されるという意味ではありませんか?
(なし)は、過去のWindowsを含む、バッファがいっぱいになるまで、またはストリームがフラッシュされるまで、一部のOSでは印刷されません。
したがって、は、
\n
でフラッシュされますが、なぜ
wprintf
が
wcout
と遅くなっていませんか?
フィードバック/ご意見ありがとうございます。私は18年前に私がこのようなものをハックし始めたときに私がしていたことを望みます。スピードアップする
あなたのプログラムではなく、実際のコンソールが遅いかもしれません。出力を 'yourprogram> file.txt'ファイルにリダイレクトするか、wcoutの代わりに実際のファイルに書き込むとスピードアップしますか? – nos
'endl'の代わりに' \ n'を使うと、パフォーマンスはどうなりますか? –
@nos:それはかなり物事を加速しました。リダイレクトされたときには2秒しかかかりません。私はバッチファイルにこれを動作させる必要があるかもしれないので、コンピュータが文章リダイレクトに頼る必要はありません:)感謝 – JimR