Подтвердить что ты не робот

Каковы варианты использования потока данных TPL над реактивными расширениями (Rx)

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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