20

特定の操作が完了するまでにかかる時間を調査しています。操作は次のようなものです。

Parallel.ForEach(items, item => SaveScheme(item));

SaveSchemeメソッドはデータベースを操作します。いくつかのクエリを実行し、情報を操作します。コレクション内の要素の量はitems十分に大きくなる可能性があります。

この操作を実行すると、完了するまでに約 20 ~ 40 秒かかります。しかし、プロファイリングをオンにして実行すると、わずか 3 秒しかかかりません!

この問題に関する情報は見つかりませんでした。私の唯一の推測は、プロファイリングParallel.ForEachを使用すると、使用しない場合よりも多くのスレッドが作成されるということですが、確かなことはわかりません。

では、なぜこのようなことが起こるのでしょうか? また、プロファイリングを行わずにアプリケーションを実行したときに、このパフォーマンスをどのように達成できるのでしょうか?


アップデート。Parallelこれとは何の関係もありません: シンプルなforeach代わりにテストしましたが、操作はまだ 3 秒で完了します!

4

5 に答える 5

37

私は答えを見つけました:

その理由は、Visual Studio内でアプリケーションを実行すると、デバッガーがそれに接続されているためです。プロファイラーを使用して実行すると、デバッガーは接続されません。

.exeを単独で実行しようとした場合、または「デバッグ」>「デバッグなしで開始」を使用してIDEからプログラムを実行した場合(またはCtrl + F5を押すだけ)、アプリケーションはプロファイラーの場合と同じ速度で実行されます。

https://stackoverflow.com/a/6629040/1563172

理由は並行性だと思ったので、以前は見つかりませんでした。

于 2012-08-17T10:01:36.510 に答える
0

プロファイリングでは、ボトルネック自体を効果的に抑制した実際のデータベース作業生成の速度が低下した (および同時実行性が低下した) 可能性があります-はい、データベース (または ....)。

于 2012-08-16T19:03:00.527 に答える
0

この結果は、アプリケーションが同時実行しようとしている可能性があることを示唆しています。実際、スレッドが互いに干渉しているか、スレッドを作成するオーバーヘッドがパフォーマンスの向上よりも大きくなっています。これは、非並行バージョンの方が高速に実行されるという事実によって証明されています!

プロファイラーの使用は、アプリケーションのパフォーマンスに影響します。おそらく、コードの速度が十分に低下しているため、複数のスレッドから何らかの利点が得られます

メソッドの背後にあるコードの詳細がなければ、これが最も可能性の高い答えのようです。

于 2012-08-17T09:58:22.767 に答える
0

あなたが実際にプロファイリングしているのは、アプリケーションの「非並列」部分にすぎないと思います。

ここを見ることをお勧めします:http://msdn.microsoft.com/en-us/library/gg663532.aspx

于 2012-08-16T09:53:16.337 に答える