3

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() 内で問題が解決しない
4

1 に答える 1

1

mono を実行しているときにフラグを試してみてください--server(最近コミットされたため、mono master とのみ互換性があります)。

于 2013-08-21T18:31:56.973 に答える