私は最近、スキップリストデータ構造を使用して同時優先度キューを実装することに挑戦しました-この質問のために、スキップリストが何であるかわからない場合は、リンクリストを描くだけで十分だと思います答える。最小限のロックを試みました(つまり、複数のエンキューとデキューを同時に許可し、必要に応じてノードまたはそのフォワードポインターのみをロックし、できるだけ早くロックを解放し、Interlockedを使用してリストをトラバースするなど)。
結果に満足しました。ただし、同期ルートロックで囲まれた追加と削除を使用して通常のスキップリストを作成する(つまり、一度に1つの操作のみを許可する)と、実際には2倍の速度でした。
実装にバグがあるはずだと思いました。ただし、MicrosoftWebサイトにリストされている「ConcurrentPriorityQueue」でさえ、実際には一度に1つの操作しか許可されていません(つまり、エンキューとデキューの周りのsyncrootロック)
原則として(そしてこの質問が一般的すぎる場合はご容赦ください)、よりきめ細かいロックが実際にパフォーマンスの向上につながるのはどの時点ですか?私の場合、Interlocked.Exchange(より良い方法はありますか?)や複数のテストアンドテストアンドセットなどを使用して大きなリストを実際にトラバースする必要があるため、エンキューとデキューが遅くなると思います。
さらに、時間の大部分がどこで費やされているかを判断するのに役立つツールはありますか?ありがとう。