Каковы варианты использования для потока данных TPL через Reactive Extensions (Rx) - PullRequest
13 голосов
/ 28 февраля 2012

Я специально рассматриваю написание некоторых алгоритмов обработки сигналов в одном или другом, или, может быть, некоторую комбинацию обоих из них.

Производительность не является большой проблемой, ясность выражения намерений важнее.

Я бы хотел реализовать следующие «блоки» и составить их:

  • Фильтры (как FIR, так и IIR)
  • Фазовые детекторы
  • Интеграторы
  • Миксеры
  • Функциональный генератор
  • PLL (используя вышеупомянутое в качестве строительных блоков)

Я получаю, что Rx можно рассматривать как«Linq-to-streams», а TPL - это абстракция над параллелизмом.Я также понял, что Rx использует TPL для управления своими асинхронными битами и что поток данных TPL добавляет возможность компоновки в TPL.

Таким образом, оба являются асинхронными, оба являются компонуемыми, оба имеют достаточно высокий уровень (Rx более того).Где каждый из них должен использоваться, как в целом, так и в моих пунктах Обработка сигналов выше?

1 Ответ

6 голосов
/ 02 марта 2012

Это зависит от того, с какими примитивами вы имеете дело - Rx и TPL гораздо богаче, если вы используете усиленные типы для передачи данных, но если вы имеете дело с отдельными выборками (такими как IObservable<byte>), ISourceBlock<float> и т. Д.) С ним может быть утомительно работать.

Недавно внедрив Функциональный генератор, БПФ, квантователь спектра мощности, я начал с Rx (это не относится к параллелизму)/ параллелизм, где TPL превосходит), но обнаружил, что я потратил больше времени, пытаясь заставить его работать в модели Rx - я в итоге остановился на System.Stream.

Это хорошо сработало для меня и было удивительно сложным.Тем не менее, производительность и отказ от GC были главными в моем списке, поэтому, если вы не возражаете, я бы предложил Rx - вы можете сделать некоторые действительно крутые вещи с реактивными комбинаторами.

...