Skip to content

Commit

Permalink
Disposable tests (#409)
Browse files Browse the repository at this point in the history
  • Loading branch information
victimsnino authored Aug 20, 2023
1 parent 0a0e7e8 commit 6eecb02
Show file tree
Hide file tree
Showing 22 changed files with 175 additions and 9 deletions.
8 changes: 4 additions & 4 deletions src/rpp/rpp/disposables/refcount_disposable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace rpp
*
* @ingroup disposables
*/
class refcount_disposable final : public interface_composite_disposable, public std::enable_shared_from_this<refcount_disposable>
class refcount_disposable : public interface_composite_disposable, public std::enable_shared_from_this<refcount_disposable>
{
public:
refcount_disposable() = default;
Expand All @@ -35,9 +35,9 @@ class refcount_disposable final : public interface_composite_disposable, public
refcount_disposable(const refcount_disposable&) = delete;
refcount_disposable(refcount_disposable&&) noexcept = delete;

bool is_disposed() const noexcept override { return m_refcount.load(std::memory_order_acquire) == 0; }
bool is_disposed() const noexcept final { return m_refcount.load(std::memory_order_acquire) == 0; }

void dispose() override
void dispose() final
{
while (auto current_value = m_refcount.load(std::memory_order_acquire))
{
Expand Down Expand Up @@ -66,7 +66,7 @@ class refcount_disposable final : public interface_composite_disposable, public

using interface_composite_disposable::add;

void add(disposable_wrapper disposable) override
void add(disposable_wrapper disposable) final
{
m_underlying.add(std::move(disposable));
}
Expand Down
9 changes: 8 additions & 1 deletion src/rpp/rpp/operators/details/utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,12 @@ class pointer_under_lock
std::scoped_lock<std::mutex> m_lock;
};


template<typename T>
struct with_auto_dispose : public T
{
~with_auto_dispose() override
{
T::dispose();
}
};
} // namespace rpp::operators::details
3 changes: 2 additions & 1 deletion src/rpp/rpp/operators/group_by.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include <rpp/operators/fwd.hpp>
#include <rpp/operators/details/strategy.hpp>
#include <rpp/operators/details/utils.hpp>
#include <rpp/observables/grouped_observable.hpp>
#include <rpp/subjects/publish_subject.hpp>
#include <rpp/disposables/refcount_disposable.hpp>
Expand Down Expand Up @@ -67,7 +68,7 @@ struct group_by_observer_strategy
RPP_NO_UNIQUE_ADDRESS KeyComparator comparator;

mutable std::map<TKey, subjects::publish_subject<Type>, KeyComparator> key_to_subject{};
std::shared_ptr<refcount_disposable> disposable = std::make_shared<refcount_disposable>();
std::shared_ptr<details::with_auto_dispose<refcount_disposable>> disposable = std::make_shared<details::with_auto_dispose<refcount_disposable>>();

void on_subscribe(rpp::constraint::observer auto& obs) const
{
Expand Down
2 changes: 1 addition & 1 deletion src/rpp/rpp/operators/merge.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
namespace rpp::operators::details
{
template<rpp::constraint::observer TObserver>
class merge_disposable final : public composite_disposable
class merge_disposable final : public with_auto_dispose<composite_disposable>
{
public:
merge_disposable(TObserver&& observer) : m_observer(std::move(observer)) {}
Expand Down
2 changes: 1 addition & 1 deletion src/rpp/rpp/operators/with_latest_from.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
namespace rpp::operators::details
{
template<rpp::constraint::observer Observer, typename TSelector, rpp::constraint::decayed_type... RestArgs>
class with_latest_from_disposable final : public composite_disposable
class with_latest_from_disposable final : public with_auto_dispose<composite_disposable>
{
public:
explicit with_latest_from_disposable(Observer&& observer, const TSelector& selector)
Expand Down
7 changes: 7 additions & 0 deletions src/tests/rpp/test_concat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"


#include <rpp/disposables/composite_disposable.hpp>
#include <rpp/disposables/disposable_wrapper.hpp>
Expand Down Expand Up @@ -237,4 +239,9 @@ TEST_CASE("concat of iterable doesn't produce extra copies")
CHECK(tracker.get_copy_count() - initial_copy == 2); // 1 copy to observable + 1 copy to observer
CHECK(tracker.get_move_count() - initial_move == 0);
}
}

TEST_CASE("concat disposes original disposable on disposing")
{
test_operator_over_observable_with_disposable<int>([](auto&& observable){return rpp::source::concat(observable);});
}
7 changes: 7 additions & 0 deletions src/tests/rpp/test_distinct_until_changed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"


TEMPLATE_TEST_CASE("distinct_until_changed filters out consecutive duplicates and send first value from duplicates", "", rpp::memory_model::use_stack, rpp::memory_model::use_shared)
{
Expand Down Expand Up @@ -46,4 +48,9 @@ TEST_CASE("distinct_until_changed doesn't produce extra copies")
.send_by_move = {.copy_count = 1, // 1 copy to internal state
.move_count = 1} // 1 move to final subscriber
});
}

TEST_CASE("distinct_until_changed disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::distinct_until_changed());
}
6 changes: 6 additions & 0 deletions src/tests/rpp/test_filter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"

#include <stdexcept>
#include <string>
Expand Down Expand Up @@ -69,4 +70,9 @@ TEST_CASE("filter doesn't produce extra copies")
.move_count = 0}
});
}
}

TEST_CASE("filter disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::filter([](const int&){return false;}));
}
7 changes: 7 additions & 0 deletions src/tests/rpp/test_first.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"


TEST_CASE("first only emits once")
{
Expand Down Expand Up @@ -88,4 +90,9 @@ TEST_CASE("first doesn't produce extra copies")
.move_count = 1} // 1 move to final subscriber
}, 2);
}
}

TEST_CASE("first disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::first());
}
7 changes: 7 additions & 0 deletions src/tests/rpp/test_flat_map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

#include "copy_count_tracker.hpp"
#include "mock_observer.hpp"
#include "disposable_observable.hpp"


#include <stdexcept>
#include <string>
Expand Down Expand Up @@ -134,4 +136,9 @@ TEMPLATE_TEST_CASE("flat_map", "", rpp::memory_model::use_stack, rpp::memory_mod
}
}
}
}

TEST_CASE("flat_map disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::flat_map([](const auto& v){return rpp::source::just(v); }));
}
2 changes: 1 addition & 1 deletion src/tests/rpp/test_group_by.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,4 +261,4 @@ TEST_CASE("group_by selectors affects types", "[group_by]")
REQUIRE(mock.get_on_completed_count() == 0);
}
}
}
}
7 changes: 7 additions & 0 deletions src/tests/rpp/test_last.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"



TEST_CASE("last only emits once")
Expand Down Expand Up @@ -92,4 +94,9 @@ TEST_CASE("last doesn't produce extra copies")
.move_count = 3} // 2 move to std::optional + 1 move to final subscriber
}, 2);
}
}

TEST_CASE("last disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::last());
}
7 changes: 7 additions & 0 deletions src/tests/rpp/test_map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"


#include <stdexcept>
#include <string>
Expand Down Expand Up @@ -63,4 +65,9 @@ TEST_CASE("map doesn't produce extra copies")
.move_count = 2} // 1 move on return from map + 1 move to final subscriber
});
}
}

TEST_CASE("map disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::map([](auto&& v){return std::forward<decltype(v)>(v);}));
}
12 changes: 12 additions & 0 deletions src/tests/rpp/test_merge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"


#include <stdexcept>
#include <string>
Expand Down Expand Up @@ -285,4 +287,14 @@ TEST_CASE("merge doesn't produce extra copies")
REQUIRE(verifier.get_copy_count() == 0);
REQUIRE(verifier.get_move_count() == 1); // 1 move to final subscriber
}
}

TEST_CASE("merge disposes original disposable on disposing")
{
auto observable_disposable = std::make_shared<rpp::composite_disposable>();
auto observable = observable_with_disposable<int>(observable_disposable);

test_operator_with_disposable<int>(rpp::ops::merge_with(observable));

CHECK(observable_disposable->is_disposed());
}
6 changes: 6 additions & 0 deletions src/tests/rpp/test_repeat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"


TEST_CASE("repeat resubscribes")
Expand Down Expand Up @@ -130,4 +131,9 @@ TEST_CASE("repeat doesn't produce extra copies")
.move_count = 2} // 2 times 1 move to final subscriber
});
}
}

TEST_CASE("repeat disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::repeat());
}
7 changes: 7 additions & 0 deletions src/tests/rpp/test_scan.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"

#include "rpp/operators/subscribe.hpp"


Expand Down Expand Up @@ -166,4 +168,9 @@ TEST_CASE("scan doesn't produce extra copies")
CHECK(tracker.get_move_count() == 3); // 2 times 1 move to internal state
}
}
}

TEST_CASE("scan disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::scan([](auto&& s, auto&&){return s; }));
}
7 changes: 7 additions & 0 deletions src/tests/rpp/test_skip.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"


TEMPLATE_TEST_CASE("skip ignores first `count` of items",
"",
Expand Down Expand Up @@ -79,4 +81,9 @@ TEST_CASE("skip doesn't produce extra copies")
.move_count = 1} // 1 move to final subscriber
}, 2);
}
}

TEST_CASE("skip disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::skip(1));
}
8 changes: 8 additions & 0 deletions src/tests/rpp/test_subscribe_on.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#include <thread>

#include "mock_observer.hpp"
#include "disposable_observable.hpp"

#include "rpp/disposables/composite_disposable.hpp"
#include "rpp/disposables/fwd.hpp"
#include "rpp/operators/fwd.hpp"
Expand Down Expand Up @@ -110,3 +112,9 @@ TEST_CASE("subscribe_on schedules job in another scheduler")
CHECK(second->is_disposed());
}
}


TEST_CASE("group_by disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::subscribe_on(rpp::schedulers::current_thread{}));
}
7 changes: 7 additions & 0 deletions src/tests/rpp/test_take.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"


TEST_CASE("take operator limits emissions")
{
Expand Down Expand Up @@ -106,4 +108,9 @@ TEST_CASE("take doesn't produce extra copies")
.move_count = 1} // 1 move to final subscriber
}, 2);
}
}

TEST_CASE("take disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::take(1));
}
7 changes: 7 additions & 0 deletions src/tests/rpp/test_take_while.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

#include "mock_observer.hpp"
#include "copy_count_tracker.hpp"
#include "disposable_observable.hpp"


#include <rpp/operators/take_while.hpp>
#include <rpp/sources/create.hpp>
Expand Down Expand Up @@ -57,4 +59,9 @@ TEST_CASE("take_while doesn't produce extra copies")
.move_count = 1} // 1 move to final subscriber
});
}
}

TEST_CASE("take_while disposes original disposable on disposing")
{
test_operator_with_disposable<int>(rpp::ops::take_while([](auto){return true; }));
}
12 changes: 12 additions & 0 deletions src/tests/rpp/test_with_lastest_from.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <rpp/operators/with_latest_from.hpp>

#include "mock_observer.hpp"
#include "disposable_observable.hpp"


TEST_CASE("with_latest_from combines observables")
Expand Down Expand Up @@ -179,4 +180,15 @@ TEST_CASE("with_latest_from handles race condition", "[with_latest_from]")
}
}
}
}

TEST_CASE("with_latest_from disposes original disposable on disposing")
{
auto observable_disposable = std::make_shared<rpp::composite_disposable>();
auto observable = observable_with_disposable<int>(observable_disposable);

test_operator_with_disposable<int>(rpp::ops::with_latest_from(observable));


CHECK(observable_disposable->is_disposed());
}
Loading

1 comment on commit 6eecb02

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BENCHMARK RESULTS (AUTOGENERATED)

ci-ubuntu-gcc

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 731.41 ns 1.60 ns 1.67 ns 0.96
Subscribe empty callbacks to empty observable via pipe operator 733.80 ns 1.20 ns 2.01 ns 0.60

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 1900.69 ns 0.40 ns 0.33 ns 1.20
from array of 1 - create + subscribe + current_thread 2768.28 ns 39.21 ns 43.90 ns 0.89
concat_as_source of just(1 immediate) create + subscribe 5701.04 ns 0.40 ns 0.33 ns 1.20

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 1461.42 ns 0.40 ns 0.33 ns 1.20
create+filter(true)+subscribe 922.93 ns 0.40 ns 0.33 ns 1.20
create(1,2)+skip(1)+subscribe 1257.32 ns 0.40 ns 0.33 ns 1.20
create(1,1,2)+distinct_until_changed()+subscribe 875.93 ns 0.40 ns 0.33 ns 1.20
create(1,2)+first()+subscribe 1805.04 ns 0.40 ns 0.33 ns 1.20
create(1,2)+last()+subscribe 1132.56 ns 0.40 ns 0.33 ns 1.20

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 763.76 ns 0.60 ns 1.00 ns 0.60
current_thread scheduler create worker + schedule 927.87 ns 6.82 ns 8.68 ns 0.79
current_thread scheduler create worker + schedule + recursive schedule 2153.87 ns 88.66 ns 89.75 ns 0.99

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 880.55 ns 0.40 ns 0.33 ns 1.20
create+scan(10, std::plus)+subscribe 1049.49 ns 0.40 ns 0.33 ns 1.20
create+flat_map(just(v*2))+subscribe 3209.21 ns 151.82 ns 150.84 ns 1.01

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 903.86 ns - - 0.00
create+take_while(true)+subscribe 865.19 ns 0.40 ns 0.33 ns 1.20

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 3139.50 ns 30.06 ns 33.75 ns 0.89

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 4329.10 ns 181.23 ns 177.23 ns 1.02
create(1) + merge_with(create(2)) + subscribe 6850.65 ns 180.07 ns 176.67 ns 1.02
create(1) + with_latest_from(create(2)) + subscribe - 141.19 ns 145.63 ns 0.97

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 113.63 ns 74.72 ns 77.64 ns 0.96

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 3932.20 ns 103.33 ns 118.83 ns 0.87

ci-macos

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 1076.68 ns 1.13 ns 1.12 ns 1.01
Subscribe empty callbacks to empty observable via pipe operator 1142.52 ns 1.12 ns 1.12 ns 1.00

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 2335.02 ns 0.44 ns 0.44 ns 1.01
from array of 1 - create + subscribe + current_thread 2933.83 ns 114.46 ns 102.52 ns 1.12
concat_as_source of just(1 immediate) create + subscribe 6806.94 ns 0.29 ns 0.28 ns 1.05

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 2019.37 ns 3.91 ns 4.18 ns 0.94
create+filter(true)+subscribe 1172.14 ns 2.78 ns 2.52 ns 1.10
create(1,2)+skip(1)+subscribe 1846.19 ns 5.46 ns 5.60 ns 0.98
create(1,1,2)+distinct_until_changed()+subscribe 1190.35 ns 8.39 ns 8.41 ns 1.00
create(1,2)+first()+subscribe 2348.94 ns 5.67 ns 5.91 ns 0.96
create(1,2)+last()+subscribe 1494.95 ns 7.69 ns 8.14 ns 0.94

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 1048.78 ns 1.14 ns 1.12 ns 1.02
current_thread scheduler create worker + schedule 1403.99 ns 9.46 ns 9.53 ns 0.99
current_thread scheduler create worker + schedule + recursive schedule 2331.45 ns 177.99 ns 163.85 ns 1.09

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 1140.99 ns 2.78 ns 2.52 ns 1.11
create+scan(10, std::plus)+subscribe 1387.36 ns 4.47 ns 5.04 ns 0.89
create+flat_map(just(v*2))+subscribe 3253.55 ns 308.17 ns 300.44 ns 1.03

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 1199.99 ns 3.34 ns 3.36 ns 0.99
create+take_while(true)+subscribe 1162.25 ns 2.50 ns 2.79 ns 0.90

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 3721.83 ns 87.25 ns 86.36 ns 1.01

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 4026.78 ns 355.31 ns 340.82 ns 1.04
create(1) + merge_with(create(2)) + subscribe 7209.47 ns 353.93 ns 360.69 ns 0.98
create(1) + with_latest_from(create(2)) + subscribe - 428.62 ns 399.59 ns 1.07

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 99.62 ns 93.79 ns 93.55 ns 1.00

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 4409.21 ns 231.18 ns 240.08 ns 0.96

ci-ubuntu-clang

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 388.38 ns 1.11 ns 0.80 ns 1.38
Subscribe empty callbacks to empty observable via pipe operator 382.64 ns 1.14 ns 1.20 ns 0.95

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 824.75 ns 0.37 ns 0.41 ns 0.91
from array of 1 - create + subscribe + current_thread 1111.00 ns 31.33 ns 25.09 ns 1.25
concat_as_source of just(1 immediate) create + subscribe 2575.77 ns 0.37 ns 0.40 ns 0.93

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 824.97 ns 0.41 ns 0.40 ns 1.03
create+filter(true)+subscribe 423.79 ns 0.40 ns 0.40 ns 0.99
create(1,2)+skip(1)+subscribe 610.05 ns 0.36 ns 0.40 ns 0.91
create(1,1,2)+distinct_until_changed()+subscribe 432.19 ns 0.69 ns 0.40 ns 1.72
create(1,2)+first()+subscribe 920.35 ns 0.38 ns 0.40 ns 0.96
create(1,2)+last()+subscribe 519.44 ns 0.39 ns 0.40 ns 0.96

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 290.78 ns 1.08 ns 1.20 ns 0.90
current_thread scheduler create worker + schedule 498.16 ns 6.71 ns 5.77 ns 1.16
current_thread scheduler create worker + schedule + recursive schedule 920.41 ns 77.44 ns 66.09 ns 1.17

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 417.09 ns 0.40 ns 0.40 ns 1.00
create+scan(10, std::plus)+subscribe 505.10 ns 0.82 ns 0.80 ns 1.02
create+flat_map(just(v*2))+subscribe 2092.07 ns 116.34 ns 82.85 ns 1.40

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 432.42 ns - - 0.00
create+take_while(true)+subscribe 435.67 ns 0.39 ns 0.40 ns 0.98

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 2261.61 ns 22.32 ns 18.04 ns 1.24

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 2506.53 ns 148.43 ns 105.99 ns 1.40
create(1) + merge_with(create(2)) + subscribe 3777.39 ns 134.99 ns 94.33 ns 1.43
create(1) + with_latest_from(create(2)) + subscribe - 122.35 ns 89.49 ns 1.37

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 47.09 ns 32.76 ns 32.47 ns 1.01

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 1832.60 ns 111.06 ns 92.22 ns 1.20

ci-windows

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 1467.36 ns 2.20 ns 2.34 ns 0.94
Subscribe empty callbacks to empty observable via pipe operator 1811.88 ns 2.41 ns 2.34 ns 1.03

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 3196.33 ns 10.14 ns 9.70 ns 1.04
from array of 1 - create + subscribe + current_thread 4661.01 ns 151.58 ns 112.83 ns 1.34
concat_as_source of just(1 immediate) create + subscribe 10629.36 ns 16.05 ns 14.61 ns 1.10

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 3028.73 ns 11.44 ns 9.28 ns 1.23
create+filter(true)+subscribe 1748.79 ns 10.40 ns 7.02 ns 1.48
create(1,2)+skip(1)+subscribe 2591.41 ns 11.92 ns 11.03 ns 1.08
create(1,1,2)+distinct_until_changed()+subscribe 1922.28 ns 22.00 ns 15.20 ns 1.45
create(1,2)+first()+subscribe 3669.68 ns 14.45 ns 14.26 ns 1.01
create(1,2)+last()+subscribe 2398.48 ns 16.53 ns 13.37 ns 1.24

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 1455.93 ns 6.54 ns 5.01 ns 1.30
current_thread scheduler create worker + schedule 2550.67 ns 14.17 ns 11.03 ns 1.28
current_thread scheduler create worker + schedule + recursive schedule 2977.58 ns 175.52 ns 136.55 ns 1.29

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 1724.05 ns 9.57 ns 6.68 ns 1.43
create+scan(10, std::plus)+subscribe 1877.90 ns 12.08 ns 11.03 ns 1.09
create+flat_map(just(v*2))+subscribe 5110.50 ns 400.90 ns 293.50 ns 1.37

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 1902.86 ns 8.82 ns 6.35 ns 1.39
create+take_while(true)+subscribe 1717.48 ns 8.55 ns 7.68 ns 1.11

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 5735.81 ns 122.25 ns 94.70 ns 1.29

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 6543.24 ns 446.89 ns 339.98 ns 1.31
create(1) + merge_with(create(2)) + subscribe 10665.98 ns 445.97 ns 342.52 ns 1.30
create(1) + with_latest_from(create(2)) + subscribe - 480.47 ns 341.43 ns 1.41

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 136.23 ns 105.18 ns 94.36 ns 1.11

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 6700.61 ns 370.26 ns 300.29 ns 1.23

Please sign in to comment.