2011-01-31 10 views
3

私は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でフラッシュされますが、なぜ wprintfwcoutと遅くなっていませんか?

フィードバック/ご意見ありがとうございます。私は18年前に私がこのようなものをハックし始めたときに私がしていたことを望みます。スピードアップする

+1

あなたのプログラムではなく、実際のコンソールが遅いかもしれません。出力を 'yourprogram> file.txt'ファイルにリダイレクトするか、wcoutの代わりに実際のファイルに書き込むとスピードアップしますか? – nos

+1

'endl'の代わりに' \ n'を使うと、パフォーマンスはどうなりますか? –

+0

@nos:それはかなり物事を加速しました。リダイレクトされたときには2秒しかかかりません。私はバッチファイルにこれを動作させる必要があるかもしれないので、コンピュータが文章リダイレクトに頼る必要はありません:)感謝 – JimR

答えて

8

改行を入れた後にストリームをフラッシュするため、std::endlラインターミネータがパフォーマンスのボトルネックを引き起こしている可能性があります。すべての出力の最後に'\n'std::wcout << std::flushと交換してください。

start = getTime(); 
for(vector<wstring>::iterator it = files.begin(); it != files.end(); ++it) 
{ 
     wcout << setw(6) << it->length() << L": " << *it << '\n'; // 1 
} 
std::wcout << std::flush; 
stop = getTime(); 
+0

ありがとう、これは物事を少しスピードアップ。 – JimR

2
wcout << setw(6) << it->length() << L": " << *it << endl; // 1 

一つの方法は、endlは単なる改行を超えているとして、ループ内で"\n"代わりのendlを使用することです!

+0

これはいくつかのナワズのことを急いでくれました。 – JimR

1

最適化コードでは、人間は多くの意味がありません、テキストの行をスクロールするのボケに追いつくことができ、それはにくいようにします。このアプローチを考え直す。テキストファイルに出力し、HTMLを使用して見栄えを良くしてから、結果を表示するプログラムを起動します。ユーザーの目には簡単です。 lotも高速に実行され、自動フラッシュは行われず、コンソールのスクロールに時間がかかりません。ディスクI/Oだけがボトルネックになりました。

+0

プログラムは最後にユーザが主に見たいと思っているいくつかの要約情報を提供します。ファイル名はそこにありますので、必要に応じて参照することができます。コンソールのスクロールバックサイズはmax(9999 lines)に設定されていて、彼が望んでいるものなので、それは彼が得たものです。 – JimR

1

私は、printfがより高速になるとは思いますが、繰り返しごとにストリームをフラッシュしないことでスピードアップする可能性が非常に高いです( '\ n'ではなくendl)。

ところで、あなたもループ外にsetwを移動することがあります。

+1

ループ外で 'setw'を動かすと、最初の反復でのみ適用されます。 –

関連する問題