Skip to content

Commit

Permalink
Minor improvements (#246)
Browse files Browse the repository at this point in the history
  • Loading branch information
victimsnino authored Aug 31, 2022
1 parent 4c4a0d7 commit 1d2b955
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 43 deletions.
63 changes: 30 additions & 33 deletions src/rpp/rpp/operators/buffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ IMPLEMENTATION_FILE(buffer_tag);

namespace rpp::details
{

/// A non-copyable class that provides a copyable on_next for the subscriber and
/// allows copies of on_next(s) to share the same states.
template<constraint::decayed_type UpstreamType>
Expand All @@ -34,49 +33,49 @@ struct buffer_state
/// \param count Number of items being bundled. Note when count == 0, we'll
/// treat the behavior like when count == 1.
explicit buffer_state(size_t count)
: m_max(std::max(size_t{1}, count))
: max(std::max(size_t{1}, count))
{
reserve_buckets();
clear_and_reserve_buckets();
}

buffer_state(const buffer_state& other) = delete;
buffer_state(buffer_state&&) noexcept = default;
buffer_state& operator=(const buffer_state&) = delete;
buffer_state& operator=(buffer_state&&) noexcept = default;

struct on_next
void clear_and_reserve_buckets() const
{
void operator()(auto&& value, const auto& subscriber, const buffer_state<UpstreamType>& state) const
{
state.m_buckets.push_back(std::forward<decltype(value)>(value));
if (state.m_buckets.size() == state.m_max)
{
subscriber.on_next(std::move(state.m_buckets));
state.reserve_buckets();
}
}
};
buckets.clear();
buckets.reserve(max);
}

const size_t max;
mutable buffer_bundle_type<UpstreamType> buckets;
};

struct on_completed
struct buffer_on_next
{
template<constraint::decayed_type UpstreamType>
void operator()(auto&& value, const auto& subscriber, const buffer_state<UpstreamType>& state) const
{
void operator()(const auto& subscriber, const buffer_state<UpstreamType>& state) const
state.buckets.push_back(std::forward<decltype(value)>(value));
if (state.buckets.size() == state.max)
{
if (!state.m_buckets.empty())
subscriber.on_next(std::move(state.m_buckets));
subscriber.on_completed();
subscriber.on_next(std::move(state.buckets));
state.clear_and_reserve_buckets();
}
};
}
};

private:
void reserve_buckets() const
struct buffer_on_completed
{
template<constraint::decayed_type UpstreamType>
void operator()(const auto& subscriber, const buffer_state<UpstreamType>& state) const
{
m_buckets.clear();
m_buckets.reserve(m_max);
if (!state.buckets.empty())
subscriber.on_next(std::move(state.buckets));
subscriber.on_completed();
}

private:
const size_t m_max;
mutable buffer_bundle_type<UpstreamType> m_buckets;
};

template<constraint::decayed_type Type>
Expand All @@ -87,17 +86,15 @@ struct buffer_impl
template<constraint::subscriber_of_type<buffer_bundle_type<Type>> TSub>
auto operator()(TSub&& subscriber) const
{
using state = buffer_state<Type>;

auto subscription = subscriber.get_subscription();

// dynamic_state there to make shared_ptr for observer instead of making shared_ptr for state
return create_subscriber_with_dynamic_state<Type>(std::move(subscription),
typename state::on_next{},
buffer_on_next{},
utils::forwarding_on_error{},
typename state::on_completed{},
buffer_on_completed{},
std::forward<TSub>(subscriber),
state{count});
buffer_state<Type>{count});
}
};

Expand Down
20 changes: 10 additions & 10 deletions src/rpp/rpp/operators/details/subscriber_with_state.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ template<constraint::decayed_type Type,
std::invocable<Type, std::decay_t<States>...> OnNext,
std::invocable<std::exception_ptr, std::decay_t<States>...> OnError,
std::invocable<std::decay_t<States>...> OnCompleted>
auto create_subscriber_with_state(rpp::composite_subscription sub,
OnNext&& on_next,
OnError&& on_error,
OnCompleted&& on_completed,
States&&... states)
auto create_subscriber_with_state(composite_subscription sub,
OnNext&& on_next,
OnError&& on_error,
OnCompleted&& on_completed,
States&&... states)
{
using TObs = state_observer<Type,
std::decay_t<OnNext>,
Expand All @@ -44,11 +44,11 @@ template<constraint::decayed_type Type,
std::invocable<Type, std::decay_t<States>...> OnNext,
std::invocable<std::exception_ptr, std::decay_t<States>...> OnError,
std::invocable<std::decay_t<States>...> OnCompleted>
auto create_subscriber_with_dynamic_state(rpp::composite_subscription sub,
OnNext&& on_next,
OnError&& on_error,
OnCompleted&& on_completed,
States&&... states)
auto create_subscriber_with_dynamic_state(composite_subscription sub,
OnNext&& on_next,
OnError&& on_error,
OnCompleted&& on_completed,
States&&... states)
{
using TObs = dynamic_state_observer<Type, std::decay_t<States>...>;
return make_specific_subscriber<Type, TObs>(std::move(sub),
Expand Down

1 comment on commit 1d2b955

@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.

ci-ubuntu-clang

Observable construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable construction 0.62ns 0.278988 2.23 0.41ns
Dynamic observable construction 47.13ns 30.8527 1.53 30.53ns
Specific observable construction + as_dynamic 42.70ns 24.7982 1.72 30.06ns

Observable lift

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable lift specific observer 156.19ns 116.106 1.35 356.77ns
Specific observable lift dynamic observer 179.95ns 139.866 1.29 376.97ns
Dynamic observable lift specific observer 245.41ns 217.183 1.13 411.67ns
Dynamic observable lift dynamic observer 246.82ns 176.704 1.40 397.08ns

Observable subscribe

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe specific observer 113.80ns 108.184 1.05 354.96ns
Specific observable subscribe dynamic observer 123.40ns 90.6278 1.36 366.43ns
Dynamic observable subscribe specific observer 196.03ns 147.415 1.33 403.86ns
Dynamic observable subscribe dynamic observer 185.47ns 147.431 1.26 388.91ns

Observable subscribe #2

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe lambda 135.06ns 97.967 1.38 354.81ns
Dynamic observable subscribe lambda 190.13ns 133.216 1.43 422.13ns
Specific observable subscribe lambda without subscription 111.88ns 91.9964 1.22 356.28ns
Dynamic observable subscribe lambda without subscription 189.45ns 138.505 1.37 400.77ns
Specific observable subscribe specific subscriber 52.24ns 42.7354 1.22 283.57ns
Dynamic observable subscribe specific subscriber 129.19ns 104.874 1.23 350.74ns
Specific observable subscribe dynamic observer 52.63ns 38.3856 1.37 303.13ns
Dynamic observable subscribe dynamic observer 113.73ns 89.628 1.27 354.07ns

Observer construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer construction 0.40ns 0.290113 1.39 0.40ns
Dynamic observer construction 35.05ns 29.0558 1.21 25.16ns
Specific observer construction + as_dynamic 35.04ns 29.3595 1.19 25.44ns

OnNext

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer OnNext 0.80ns 0.623317 1.29 0.82ns
Dynamic observer OnNext 2.01ns 1.83278 1.10 2.81ns

Subscriber construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Make subsriber 59.13ns 41.2615 1.43 80.46ns
Make copy of subscriber 20.08ns 15.7863 1.27 5.67ns
Transform subsriber to dynamic 55.02ns 46.965 1.17 31.98ns

Subscription

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
composite_subscription create 50.14ns 80.9935 0.62 63.46ns
composite_subscription add 59.55ns 51.178 1.16 25.51ns
composite_subscription unsubscribe 15.10ns 11.9759 1.26 13.10ns

buffer

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
buffer 322.35ns 361.924 0.89 2266.49ns
sending of values from observable via buffer to subscriber 7.70ns 6.51742 1.18 32.38ns

chains creation test

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
long non-state chain creation + subscribe 327.22ns 279.0 1.17 606.71ns
long stateful chain creation + subscribe 478.01ns 366.452 1.30 959.18ns

combine_latest

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
combine_latest construction from observable via dot + subscribe 757.49ns 651.95 1.16 1073.19ns
sending of values from observable via combine_latest to subscriber 21.71ns 20.8586 1.04 2.82ns

concat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
concat 1706.19ns 1262.1 1.35 3613.30ns
concat_with 2021.59ns 1682.37 1.20 4036.34ns

distinct_until_changed

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
distinct_until_changed construction from observable via dot + subscribe 153.41ns 111.535 1.38 348.77ns
sending of values from observable via distinct_until_changed to subscriber 3.22ns 2.70125 1.19 2.41ns

first

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
first construction from observable via dot + subscribe 173.56ns 150.07 1.16 707.48ns
sending of values from observable via first to subscriber 0.80ns 0.530903 1.52 0.81ns

foundamental sources

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
empty 102.37ns 106.851 0.96 756.49ns
error 162.06ns 153.03 1.06 896.65ns
never 56.54ns 50.6983 1.12 309.23ns

from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
from vector with int 119.40ns 112.914 1.06 794.86ns

immediate scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 32.92ns 20.8966 1.58 134.90ns
re-schedule 10 times 39.70ns 28.5636 1.39 169.03ns

just

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
just send int 104.08ns 125.392 0.83 765.98ns
just send variadic 139.59ns 111.742 1.25 905.35ns

map

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
map construction from observable via dot + subscribe 115.25ns 94.2446 1.22 303.01ns
sending of values from observable via map to subscriber 1.21ns 0.985725 1.22 1.81ns

merge

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
merge 1647.70ns 1285.5 1.28 3613.94ns
merge_with 1957.59ns 2130.06 0.92 3850.13ns

observe_on

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
observe_on construction from observable via dot + subscribe 719.02ns 566.821 1.27 3065.02ns
sending of values from observable via observe_on to subscriber 108.47ns 97.4523 1.11 241.37ns

publish_subject callbacks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_next 28.93ns 31.7574 0.91 11.34ns
on_error 0.61ns 0.531266 1.14 22.99ns
on_completed 0.61ns 0.50567 1.20 0.81ns

publish_subject routines

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
construct 232.67ns 180.041 1.29 224.86ns
get_observable 34.95ns 25.7287 1.36 59.38ns
get_subscriber 69.85ns 54.6707 1.28 16.80ns

repeat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
repeat construction from observable via dot + subscribe 4825.40ns 4167.0 1.16 3161.94ns

scan

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
scan construction from observable via dot + subscribe 151.28ns 109.645 1.38 370.21ns
sending of values from observable via scan to subscriber 2.41ns 2.35378 1.02 2.41ns

skip

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
skip construction from observable via dot + subscribe 145.10ns 114.28 1.27 563.67ns
sending of values from observable via skip to subscriber 2.81ns 2.28547 1.23 2.13ns

switch_on_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
switch_on_next construction from observable via dot + subscribe 2269.47ns 1635.33 1.39 3539.21ns
sending of values from observable via switch_on_next to subscriber 631.33ns 457.585 1.38 781.15ns

take

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take construction from observable via dot + subscribe 224.83ns 194.654 1.16 591.59ns
sending of values from observable via take to subscriber 2.81ns 3.05458 0.92 4.03ns

trampoline scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 47.48ns 29.5654 1.61 196.19ns
re-schedule 10 times 67.00ns 44.9009 1.49 237.56ns
recursively schedule 10 times 1754.15ns 1827.72 0.96 6691.22ns

window

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
window 2453.41ns 1989.85 1.23 3684.50ns
sending of values from observable via window to subscriber 667.31ns 477.646 1.40 436.50ns

with_latest_from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
with_latest_from construction from observable via dot + subscribe 788.84ns 741.03 1.06 1334.08ns
sending of values from observable via with_latest_from to subscriber 21.29ns 16.4996 1.29 3.82ns

ci-ubuntu-gcc

Observable construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable construction 0.33ns 0.357867 0.92 0.40ns
Dynamic observable construction 27.03ns 31.214 0.87 24.81ns
Specific observable construction + as_dynamic 35.62ns 29.1661 1.22 25.49ns

Observable lift

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable lift specific observer 131.58ns 146.043 0.90 368.88ns
Specific observable lift dynamic observer 186.73ns 176.309 1.06 434.22ns
Dynamic observable lift specific observer 268.61ns 239.839 1.12 498.00ns
Dynamic observable lift dynamic observer 261.80ns 235.642 1.11 413.69ns

Observable subscribe

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe specific observer 98.25ns 101.898 0.96 390.18ns
Specific observable subscribe dynamic observer 93.39ns 120.058 0.78 406.54ns
Dynamic observable subscribe specific observer 175.57ns 173.537 1.01 406.94ns
Dynamic observable subscribe dynamic observer 175.99ns 205.406 0.86 386.70ns

Observable subscribe #2

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe lambda 102.39ns 91.473 1.12 363.80ns
Dynamic observable subscribe lambda 206.28ns 168.664 1.22 419.54ns
Specific observable subscribe lambda without subscription 115.76ns 112.66 1.03 383.58ns
Dynamic observable subscribe lambda without subscription 206.96ns 170.803 1.21 418.54ns
Specific observable subscribe specific subscriber 51.28ns 48.8849 1.05 310.73ns
Dynamic observable subscribe specific subscriber 139.99ns 154.804 0.90 337.56ns
Specific observable subscribe dynamic observer 55.78ns 61.6762 0.90 329.24ns
Dynamic observable subscribe dynamic observer 130.08ns 131.473 0.99 347.40ns

Observer construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer construction 0.40ns 0.350405 1.14 0.34ns
Dynamic observer construction 30.45ns 29.819 1.02 24.21ns
Specific observer construction + as_dynamic 30.30ns 29.57 1.02 19.58ns

OnNext

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer OnNext 0.37ns 0.381955 0.97 0.38ns
Dynamic observer OnNext 2.03ns 2.07109 0.98 1.94ns

Subscriber construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Make subsriber 41.19ns 46.9226 0.88 63.75ns
Make copy of subscriber 20.59ns 20.1579 1.02 5.58ns
Transform subsriber to dynamic 44.53ns 52.6984 0.84 25.90ns

Subscription

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
composite_subscription create 48.56ns 46.5792 1.04 74.00ns
composite_subscription add 48.55ns 69.2773 0.70 18.55ns
composite_subscription unsubscribe 16.71ns 13.5823 1.23 13.30ns

buffer

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
buffer 270.81ns 305.995 0.89 2382.95ns
sending of values from observable via buffer to subscriber 6.85ns 8.47979 0.81 30.99ns

chains creation test

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
long non-state chain creation + subscribe 352.96ns 441.524 0.80 995.18ns
long stateful chain creation + subscribe 525.17ns 505.189 1.04 1047.82ns

combine_latest

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
combine_latest construction from observable via dot + subscribe 741.65ns 707.883 1.05 1253.26ns
sending of values from observable via combine_latest to subscriber 20.52ns 23.1541 0.89 2.13ns

concat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
concat 1636.80ns 1771.91 0.92 4608.78ns
concat_with 2125.16ns 2019.7 1.05 4639.03ns

distinct_until_changed

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
distinct_until_changed construction from observable via dot + subscribe 160.16ns 127.184 1.26 418.90ns
sending of values from observable via distinct_until_changed to subscriber 3.15ns 3.55829 0.88 1.25ns

first

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
first construction from observable via dot + subscribe 177.86ns 194.54 0.91 822.87ns
sending of values from observable via first to subscriber 0.73ns 0.947224 0.78 0.58ns

foundamental sources

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
empty 108.56ns 99.9769 1.09 846.98ns
error 154.62ns 160.881 0.96 969.55ns
never 56.24ns 58.6824 0.96 313.75ns

from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
from vector with int 155.27ns 118.287 1.31 861.89ns

immediate scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 28.32ns 37.9598 0.75 143.85ns
re-schedule 10 times 53.09ns 55.5988 0.95 206.28ns

just

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
just send int 110.50ns 215.804 0.51 913.41ns
just send variadic 134.50ns 124.238 1.08 928.16ns

map

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
map construction from observable via dot + subscribe 97.07ns 111.268 0.87 381.23ns
sending of values from observable via map to subscriber 1.19ns 0.980805 1.22 1.64ns

merge

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
merge 1676.49ns 1566.87 1.07 5966.41ns
merge_with 2080.95ns 1979.32 1.05 4850.03ns

observe_on

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
observe_on construction from observable via dot + subscribe 749.45ns 617.191 1.21 3313.23ns
sending of values from observable via observe_on to subscriber 105.82ns 100.576 1.05 302.14ns

publish_subject callbacks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_next 26.53ns 25.635 1.03 14.31ns
on_error 0.73ns 0.77426 0.95 17.68ns
on_completed 0.73ns 1.14084 0.64 0.68ns

publish_subject routines

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
construct 247.29ns 242.942 1.02 204.43ns
get_observable 42.30ns 36.4378 1.16 60.13ns
get_subscriber 58.82ns 64.4121 0.91 27.55ns

repeat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
repeat construction from observable via dot + subscribe 4944.71ns 6695.32 0.74 3711.47ns

scan

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
scan construction from observable via dot + subscribe 171.89ns 199.915 0.86 432.26ns
sending of values from observable via scan to subscriber 3.48ns 3.30607 1.05 1.81ns

skip

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
skip construction from observable via dot + subscribe 157.13ns 135.593 1.16 591.52ns
sending of values from observable via skip to subscriber 4.20ns 4.43001 0.95 2.23ns

switch_on_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
switch_on_next construction from observable via dot + subscribe 2114.35ns 2054.63 1.03 5411.20ns
sending of values from observable via switch_on_next to subscriber 726.94ns 579.471 1.25 1218.93ns

take

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take construction from observable via dot + subscribe 217.09ns 242.699 0.89 710.27ns
sending of values from observable via take to subscriber 5.60ns 7.08285 0.79 3.43ns

trampoline scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 54.30ns 49.5797 1.10 189.79ns
re-schedule 10 times 83.05ns 69.7719 1.19 237.12ns
recursively schedule 10 times 1606.46ns 1832.31 0.88 7745.26ns

window

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
window 2636.48ns 2222.27 1.19 3670.56ns
sending of values from observable via window to subscriber 704.32ns 671.532 1.05 541.84ns

with_latest_from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
with_latest_from construction from observable via dot + subscribe 671.90ns 744.393 0.90 1855.88ns
sending of values from observable via with_latest_from to subscriber 19.79ns 17.0356 1.16 3.77ns

ci-windows

Observable construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable construction 1.84ns 1.81942 1.01 0.72ns
Dynamic observable construction 108.63ns 96.0638 1.13 166.56ns
Specific observable construction + as_dynamic 92.62ns 93.5141 0.99 182.83ns

Observable lift

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable lift specific observer 194.80ns 214.681 0.91 1745.53ns
Specific observable lift dynamic observer 267.22ns 247.5 1.08 1817.84ns
Dynamic observable lift specific observer 399.02ns 369.453 1.08 1630.76ns
Dynamic observable lift dynamic observer 308.64ns 309.414 1.00 1418.79ns

Observable subscribe

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe specific observer 177.90ns 176.989 1.01 1582.55ns
Specific observable subscribe dynamic observer 199.48ns 187.983 1.06 1429.60ns
Dynamic observable subscribe specific observer 348.47ns 314.294 1.11 1735.71ns
Dynamic observable subscribe dynamic observer 262.57ns 253.173 1.04 1389.60ns

Observable subscribe #2

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe lambda 206.30ns 176.525 1.17 1456.53ns
Dynamic observable subscribe lambda 334.12ns 319.021 1.05 1682.29ns
Specific observable subscribe lambda without subscription 166.51ns 160.972 1.03 1787.95ns
Dynamic observable subscribe lambda without subscription 315.41ns 331.624 0.95 1745.28ns
Specific observable subscribe specific subscriber 51.65ns 57.5038 0.90 916.59ns
Dynamic observable subscribe specific subscriber 214.60ns 198.019 1.08 1109.74ns
Specific observable subscribe dynamic observer 54.81ns 73.1388 0.75 1239.47ns
Dynamic observable subscribe dynamic observer 107.16ns 133.524 0.80 1089.52ns

Observer construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer construction 5.23ns 1.80391 2.90 1.74ns
Dynamic observer construction 102.20ns 177.159 0.58 215.83ns
Specific observer construction + as_dynamic 110.95ns 98.3815 1.13 139.36ns

OnNext

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer OnNext 0.67ns 0.820956 0.82 0.82ns
Dynamic observer OnNext 2.05ns 2.0143 1.02 2.95ns

Subscriber construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Make subsriber 96.48ns 114.076 0.85 406.62ns
Make copy of subscriber 15.94ns 20.0653 0.79 37.08ns
Transform subsriber to dynamic 108.14ns 115.562 0.94 171.17ns

Subscription

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
composite_subscription create 108.16ns 111.219 0.97 442.00ns
composite_subscription add 72.24ns 104.976 0.69 78.00ns
composite_subscription unsubscribe 20.11ns 17.3849 1.16 29.22ns

buffer

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
buffer 536.91ns 461.762 1.16 5188.33ns
sending of values from observable via buffer to subscriber 8.25ns 7.94561 1.04 104.19ns

chains creation test

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
long non-state chain creation + subscribe 363.67ns 330.198 1.10 2078.43ns
long stateful chain creation + subscribe 831.44ns 808.947 1.03 3917.29ns

combine_latest

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
combine_latest construction from observable via dot + subscribe 1289.21ns 1304.0 0.99 4043.71ns
sending of values from observable via combine_latest to subscriber 37.30ns 42.9577 0.87 4.76ns

concat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
concat 4000.80ns 2416.31 1.66 14601.00ns
concat_with 3462.78ns 3228.9 1.07 15992.50ns

distinct_until_changed

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
distinct_until_changed construction from observable via dot + subscribe 268.07ns 240.786 1.11 1384.48ns
sending of values from observable via distinct_until_changed to subscriber 6.13ns 4.32059 1.42 4.22ns

first

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
first construction from observable via dot + subscribe 183.40ns 172.083 1.07 2831.00ns
sending of values from observable via first to subscriber 3.19ns 3.24229 0.99 1.16ns

foundamental sources

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
empty 86.03ns 95.716 0.90 3535.60ns
error 148.61ns 165.439 0.90 3653.80ns
never 56.05ns 52.9195 1.06 1144.35ns

from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
from vector with int 188.84ns 186.294 1.01 3135.20ns

immediate scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 32.55ns 33.341 0.98 409.78ns
re-schedule 10 times 163.39ns 144.757 1.13 548.31ns

just

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
just send int 109.64ns 100.396 1.09 3155.25ns
just send variadic 161.72ns 148.48 1.09 2995.80ns

map

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
map construction from observable via dot + subscribe 127.22ns 122.304 1.04 1379.13ns
sending of values from observable via map to subscriber 4.37ns 4.01307 1.09 7.35ns

merge

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
merge 3167.82ns 2200.23 1.44 12625.00ns
merge_with 4991.12ns 3063.0 1.63 16132.70ns

observe_on

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
observe_on construction from observable via dot + subscribe 999.61ns 987.032 1.01 8163.00ns
sending of values from observable via observe_on to subscriber 152.90ns 101.599 1.50 1112.48ns

publish_subject callbacks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_next 26.56ns 23.944 1.11 40.28ns
on_error 3.17ns 4.68216 0.68 24.39ns
on_completed 2.57ns 3.24275 0.79 0.86ns

publish_subject routines

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
construct 402.43ns 426.967 0.94 753.48ns
get_observable 34.58ns 32.9494 1.05 172.36ns
get_subscriber 58.04ns 60.3848 0.96 96.08ns

repeat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
repeat construction from observable via dot + subscribe 7448.25ns 8095.8 0.92 14626.00ns

scan

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
scan construction from observable via dot + subscribe 294.08ns 246.379 1.19 1449.84ns
sending of values from observable via scan to subscriber 6.93ns 6.40909 1.08 10.14ns

skip

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
skip construction from observable via dot + subscribe 221.14ns 228.806 0.97 1830.54ns
sending of values from observable via skip to subscriber 5.50ns 4.42247 1.24 4.10ns

switch_on_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
switch_on_next construction from observable via dot + subscribe 3742.00ns 4324.0 0.87 13577.50ns
sending of values from observable via switch_on_next to subscriber 923.77ns 964.727 0.96 3997.50ns

take

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take construction from observable via dot + subscribe 303.22ns 293.802 1.03 2855.50ns
sending of values from observable via take to subscriber 7.77ns 6.53722 1.19 7.05ns

trampoline scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 42.53ns 51.0016 0.83 739.13ns
re-schedule 10 times 239.55ns 161.523 1.48 807.55ns
recursively schedule 10 times 4116.33ns 4217.0 0.98 24089.50ns

window

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
window 3612.14ns 3702.9 0.98 14618.30ns
sending of values from observable via window to subscriber 1049.22ns 1005.31 1.04 1869.44ns

with_latest_from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
with_latest_from construction from observable via dot + subscribe 1483.90ns 1293.17 1.15 4327.20ns
sending of values from observable via with_latest_from to subscriber 38.80ns 35.1355 1.10 8.23ns

Please sign in to comment.