0

私は関数を持っています。これは、行列に対していくつかの演算を実行する関数foo()です。 コンソールアプリケーションで関数を呼び出すと、結果を返すのに1秒かかる。 Windowsのフォームアプリケーション(ボタンをクリックし、新しいスレッドを開始し、スレッドからfoo()を呼び出す)で関数を呼び出すと、関数は3秒で復帰する必要があります。同一の入力と同じ出力であることは明らかです。 私はそれがWindowsフォームを処理するスレッドがまだアクティブであるためだと思う、それを停止するか、それを優先させるのが遅くなるか?スレッドの優先度と関数実行時間

+0

「考える」しないでください。測定する。 –

+0

よく私は関数を計算する時間を測定するためにc_clockを使用していますが、そのスレッドにアクセスする方法がわからないので、スレッドが時間を費やす時間を測定する方法がないので、 "考える" – andrea

+0

プロファイラを使用します。 .NETはあなたの背中の背後にある多くのことをしているので、このような簡単な測定を損なう可能性があるので、 'clock'を使った測定は非常に不正確です。 –

答えて

1

フォームイベントスレッドを強制終了する理由がわかりません。これにより、アプリケーションが使用できなくなります。このスレッドは、計算集約型のタスクを実行していないため、フォーム上のイベントを待っているため、優先度を低く設定することはほとんどありません。

スレッドが完了するまでの時間を正確に指定してください。コンソールアプリケーションには表示されないスレッドの開始/停止には、一定のオーバーヘッドがあります。

+0

私はこのようにしています:clock_t finish(clock()); foo(); clock_t finish(clock()); int n = finish-start;コンソールの場合、値は約1000です。ウィンドウの形式は約3500です。それは私には本当に奇妙な音です。関数は本当に同じです、私はボタンをクリックして呼び出されたスレッドを追加...それはそれです – andrea

+0

どのようにスレッドの 'n'を通知し、それを表示するか、デバッガのスレッドを停止し、検査それは計算された後ですか?この値は、@ Tudorのヒントと同じでなければなりません。同じコアタイプで同じ作業をしています。 1000-3000プロセッサのダンプでは、foo()が何かによって中断されたことを知ることは不運で、テストを複数回実行したと確信しています。スレッドによって開始されると、foo()はreturnとsecond clock_tの呼び出しまで実行される可能性が非常に高いです。 –

+0

よく私は、opencvライブラリで定義された関数がコンソールよりもWindowsフォームで4倍多くなることを発見しました。私はちょうど関数を書き換えて、パフォーマンスはほぼ同じです。 – andrea

関連する問題