2011-12-06 16 views
4

スレッドに大きく依存するプログラムを作成しました。さらに、スレッドごとの合計時間と実行時間(カーネル時間+ユーザ時間)を測定する必要があります。スレッド実行タイミング

スレッド数は任意で、多数のスレッドを同時に実行できます。これはユーザーの操作に委ねられています。できるだけ早く実行する必要があるので、スレッド時間を測定するためにWMI/Performance Monitorのようなオーバーヘッドがあるものを使用するのは理想的ではありません。この記事のように瞬間

、私は、GetThreadTimesを使用しています:http://www.codeproject.com/KB/dotnet/ExecutionStopwatch.aspx

私の質問は単純です:私は、.NETスレッドがシステムスレッド(と一対一に対応しないことも理解してこれまでのすべてのテストでは、1対1であったようです)。その場合、.NETが2つ以上のスレッドを1つのシステムスレッドに入れることにした場合、私はタイミングコードから奇妙な結果を得るつもりですか?もしそうなら(あるいはそうでなくても)、.NETスレッドのカーネルとユーザー時間を測定する別の方法がありますか?

+3

個人的に私は[SmartThreadPool](http://www.codeproject.com/KB/threads/smartthreadpool.aspx)のようなスレッドプールに行き、それらのパフォーマンスカウンターを使って物を測定します。 –

+0

私はあなたの質問を理解するのが難しく、むしろあなたが実際に測定したいものとその理由を理解しています。単純なタイミングやANTSやJetbrainのような通常のCPUプロファイラでは、Stopwatchタイプ+ロギングの使用を検討しましたか? – Mahol25

答えて

1

説明:マルチスレッドはスレッドスケジューラによって内部的に管理されます。スレッドスケジューラは、CLRが通常オペレーティングシステムに委任する関数です。スレッドスケジューラは、すべてのアクティブなスレッドに適切な実行時間が割り当てられていること、および待機中またはブロック中のスレッド(排他ロックまたはユーザー入力など)がCPU時間を消費しないことを保証します。 理論的にはNETチームが独自のスケジューラを実装するかもしれませんが、私はthis.SoのためにGetThreadTimes関数が必要なものだと思っています。

関連する問題