我最近尝试使用跳过列表数据结构实现并发优先级队列——为了这个问题,如果你不知道什么是跳过列表,我相信只画一个链表就足够了回答。我尝试了最小锁定(即同时允许多个入队和出队,仅在必要时锁定节点或其前向指针,尽快释放锁,使用互锁遍历列表等)。
我对结果很满意。然而,编写一个带有同步根锁的添加和删除的常规跳过列表(即在任何给定时间只允许一个操作),实际上速度是原来的两倍。
我认为我的实现中一定有错误。但是,即使是 Microsoft 网站上列出的“并发优先级队列”,实际上也一次只允许一个操作(即围绕入队和出队的同步根锁定)
作为一般规则(如果这个问题过于笼统,请原谅我),在什么时候更细粒度的锁定实际上会导致性能提升?我想在我的情况下,因为我实际上必须使用 Interlocked.Exchange 遍历大型列表(有更好的方法吗?)以及多个测试和测试和设置等,这会减慢入队和出队的速度。
此外,是否有工具可以帮助我确定大部分时间都花在了哪里?谢谢。