Web Analytics
yangyang

码农兼一个普普通通小青年

ConcurrentQueue


ConcurrentQueue的Count属性的复杂度分析

在普通的在普通的非线程安全集合(如 List 或 Queue)中,Count 通常只是简单地返回一个内部维护的 int 字段,时间复杂度是严格的 O(1)。然而,当在并发集合中,为了追求极致的高吞吐量,Count属性的实现可能会发生变化。本文通过分析 ConcurrentQueue 的源码,分析ConcurrentQueue的Count实现,并尝试回答为什么它不使用简单的 Interlocked 计数。最后在使用集合时,如果要判断是否为空,使用IsEmpty或者Any()方法,在大多数集合中,是否为空是一个极其快速的O(1)操作,绝对不要写if (queue.Count0)这样的代码。另外,不是所有的集合的Count方法的时间复杂度都是相同的,主要要考虑的是集合内部实现的数据结构。 …

ConcurrentQueue

股票行情处理的性能优化与实践

本文针对高频交易与极速行情系统中的“生产者-消费者”队列同步机制,以行情处理模块为例,剖析了四代架构的性能优化实践。最初基于 ConcurrentQueue 与 AutoResetEvent 的方案存在频繁的用户态至内核态切换开销,导致严重的算力浪费。为规避此瓶颈,系统先后引入了 .NET 的 BlockingCollection 以及基于 SemaphoreSlim 的定制方案,通过自旋等待(SpinWait)与轻量级信号量大幅降低了内核调度频率,但由于严格的计数映射,引入了冗余的状态维护成本。最终,系统采用 ManualResetEventSlim 进行重构,剥离了计数包袱,实现了状态同步的O(1) 极低开销。基准测试表明,采用轻量级无锁同步架构,相较于传统内核级锁,吞吐量耗时降低逾 37%。本文给出了每一阶段的演进代码与底层原理分析,为构建低延迟吞吐系统提供了参考。 …

AutoResetEvent ConcurrentQueue BlockingCollection SemaphoreSlim ManualResetEventSlim BenchmarkDotNet Producer-Consumer Model HFT

  • 1