我特别想用其中一种或另一种,或者两者的组合来编写一些信号处理算法。
绩效不是什么大问题,表达意图的清晰性更重要。
我希望实现以下"块"并组合它们:
- 滤波器(FIR和IIR)
- 相位检测器
- 集成商
- 混合器
- 函数生成器
- PLL(使用以上内容作为构建块)
我知道Rx可以被认为是"Linq-to-streams",TPL是对并发的抽象。我还了解到Rx在内部使用TPL来管理其异步位,并且TPL数据流为TPL添加了可组合性。
所以两者都是异步的,都是可组合的,都非常高级(Rx-moreso)。在一般情况下以及在我上面的信号处理项目中,每种都应该在哪里使用?
这取决于你处理的基元类型-如果你使用放大类型来推送数据,Rx和TPL会更丰富,但如果你处理的是单个样本(如IObservable<byte>
、ISourceBlock<float>
等),处理起来可能会很乏味。
最近实现了函数生成器、FFT、功率谱量化器等,我从Rx开始(这不是TPL擅长的并发/并行性),但发现我花了更多的时间试图让它在Rx模型中工作——我最终选择了System.Stream
。
它对我来说效果很好,而且令人惊讶地可堆肥。然而,性能和避免GC是我的首要任务,所以如果你不介意的话,我建议Rx——你可以用反应组合子做一些非常酷的事情。