QueueUserWorkItem() への呼び出しの前後で、プロファイラーで断続的なスパイクが発生します。毎秒約 20 件のジョブをキューに入れています。各ジョブの複雑さはほぼ同じです。ジョブの 95% は、QueueUserWorkItem の呼び出しに 0.01 ミリ秒未満を費やしています。しかし、一見ランダムに見える数秒ごとに、ジョブには 20 ~ 60 ミリ秒かかります。
スムーズなシミュレーションを構築しようとしていますが、バックグラウンド タスクをキューに入れるだけで、フレームレートが大幅に低下します。
これは、ジョブが実際に終了するのにかかる時間ではなく、単にジョブをキューに入れるのに費やされた時間です。これにはほとんど時間がかからないはずなので、これは非常にイライラします。
foreach ( Job j in jobs_to_process )
{
Job current_job = j;
if ( !current_job.queued )
{
current_job.queued = true;
Profiler.BeginSample("QueueWorkItem");
ThreadPool.UnsafeQueueUserWorkItem( current_job.DoCalculation, null );
Profiler.EndSample();
}
}
//now I remove queued items from jobs_to_process, move them to jobs_in_progress list
私が試したこと:
- 1 秒あたりのジョブ数を少なくすると、それに比例してヒッチが少なくなりますが、それでもヒッチが発生します。
- job.queued 変数へのすべてのアクセスに lock(obj) を配置する
- defaultThreadPool の代わりに SmartThreadPool を使用します。STP の QueueWorkItem() 内で問題が解決しない