c#でのシングルスピンの長さはどれくらいですか? 私が知りたいのは、spinCount パラメータを持つ ManualResetEventSlim があり、各スピンがミリ秒単位でどれくらいの長さか、またはそれがどのように機能するかを知りたいですか? スピンは、カーネル待機よりも短い待機の方が効率的であることを知っています。したがって、通常2〜10秒かかるジョブの場合、この値を何に設定する必要があるかを確認しようとしています。
2 に答える
spinCount
コンストラクターのパラメーターと、スピン待機に費やされたミリ秒数との間に相関関係はありません。
これがどのように機能するかです。MRES は、このspinCount
パラメータを使用して、 とは独立した独自の待機ルーチンを実行しThread.SpinWait
ます。
Thread.Yield
最初の 10 回の反復では、との呼び出しが交互に行われThread.SpinWait
ます。への呼び出しThread.SpinWait
は のスピンで始まり、Environment.ProcessorCount * 4
連続する呼び出しごとに約 2 倍になります。- その後、各反復は 20 回の呼び出しで割り切れます
Thread.Sleep(1)
。 - それ以外の場合は、5 で割り切れるものを呼び出します
Thread.Sleep(0)
。 - それ以外の場合
Thread.Yield
は呼び出されます。 - は
CancellationToken
、100 回以降は 10 回の反復ごとにチェックされます。
ご覧のとおり、MRES のカスタム スピニング ルーチン内ではかなり複雑な歌と踊りが行われています。また、アルゴリズムはバージョンごとに変更される可能性があります。各スピンがどれくらい続くかを予測する方法は実際にはありません.
典型的な待機時間が 2 ~ 10 秒の場合、パラメータは 2047 に制限されているためMonitor.Wait
、Monitor.Pulse
コーディネーションを介してカーネル レベルの待機が行われることはほぼ確実です。spinCount
さらに、2 ~ 10 秒は長い時間です。あなたは本当にそんなに長く回したいですか?
スピン数は小さくすることを意図しています。デフォルトは 10 (シングル プロセッサで実行している場合は 1) です。スピン カウントを指定できるコンストラクターを使用する場合、許可される最大値は 2047 です。イベントがすぐに通知されない場合、ManualResetEventSlim は通常のイベント ハンドル待機を使用します。@HenkHolterman が述べたように、関連する時間は数秒よりもはるかに小さいです。私たちはサイクルについて話しているのであって、秒でもミリ秒でもありません。
http://msdn.microsoft.com/en-us/library/5hbefs30.aspx
.NET Framework バージョン 4 では、System.Threading.ManualResetEventSlim クラスを使用して、待機時間が非常に短いと予想される場合や、イベントがプロセス境界を超えない場合にパフォーマンスを向上させることができます。ManualResetEventSlim は、イベントがシグナル状態になるのを待つ間、短時間ビジー スピンを使用します。待機時間が短い場合、スピンは、待機ハンドルを使用して待機するよりもはるかに低コストになる可能性があります。ただし、イベントが一定時間内にシグナル状態にならない場合、ManualResetEventSlim は通常のイベント ハンドル待機に頼ります。
http://msdn.microsoft.com/en-us/library/ee722114.aspx
マルチコア コンピューターでは、リソースが長期間保持されることが予想されない場合は、待機中のスレッドが数十または数百サイクルの間ユーザー モードでスピンしてから、リソースの取得を再試行する方が効率的です。 . 回転後にリソースが利用できる場合は、数千サイクルを節約できました。リソースがまだ使用できない場合は、数サイクルしか使用していないため、カーネルベースの待機に入ることができます。
編集:ただし、質問に直接答えるために、単一のスピンの時間の長さは、それが実行されているハードウェアに依存するため、明確に答えることはできません. http://msdn.microsoft.com/en-us/library/system.threading.thread.spinwait(v=vs.95).aspx
SpinWait は基本的に、反復パラメーターで指定されたループ カウントで、プロセッサを非常にタイトなループに陥れます。したがって、待機時間はプロセッサの速度によって異なります。