rx.java наблюдаемый несколько вызовов фильтра против одного вызова фильтра - PullRequest
3 голосов
/ 24 мая 2019

Я хочу отфильтровать элементы, испускаемые Observable, но у меня есть много критериев фильтрации, и мне интересно, как лучше это сделать - с точки зрения производительности

Один из способов - вызвать one метод «filter», который имеет все критерии в нескольких операторах «if» и возвращает окончательный результат фильтрации, и вызывает:

observable
    .filter(this::filter)

Другим способом было бы иметь несколько методов «filterX»,каждый фильтрует по определенным критериям и называет их в цепочке:

observable
    .filter(this::filterX)
    .filter(this::filterY)
    .filter(this::filterZ)

Мой вопрос - есть ли разница в производительности, и какой из этих двух вариантов является «лучшей практикой»?Я нахожу второй более приятным и читабельным, но в настоящее время я столкнулся с методом «фильтра» с ~ 30 выражениями if, и мне интересно, стоит ли мне беспокоиться и рефакторировать его во втором подходе.

Спасибо!

1 Ответ

3 голосов
/ 29 мая 2019

Библиотека RxJava пытается оптимизировать сценарий, описанный вами, с помощью концепции Operator Fusion :

Слияние операторов предполагает, что некоторые операторы могут быть объединены в один оператор.(макро-слияние) или их внутренние структуры данных, совместно используемые друг с другом (микро-слияние), что позволяет меньше распределений, снизить накладные расходы и повысить производительность.

Это дает конкретный пример об операторе фильтра в проектный документ :

  • a - это b, и набор параметров двух операторов может быть объединен в одно приложение.Пример: фильтр (p1) .filter (p2) объединен в фильтр (p1 && p2).

Таким образом, в вашем случае библиотека постарается изо всех сил объединить все фильтры вчтобы не было большой разницы в производительности.

...