Skip to content

Try to add some extra type erasure without performance hit to reduce binary bloat#320

Closed
AlexInLog wants to merge 6 commits into
mainfrom
type_erasure_v2
Closed

Try to add some extra type erasure without performance hit to reduce binary bloat#320
AlexInLog wants to merge 6 commits into
mainfrom
type_erasure_v2

Conversation

@AlexInLog

Copy link
Copy Markdown
Owner

No description provided.

@codecov

codecov Bot commented Jan 11, 2023

Copy link
Copy Markdown

Codecov Report

Merging #320 (2f354a9) into main (b71638e) will increase coverage by 0.04%.
The diff coverage is 100.00%.

@@            Coverage Diff             @@
##             main     #320      +/-   ##
==========================================
+ Coverage   97.88%   97.92%   +0.04%     
==========================================
  Files         114      114              
  Lines        1794     1830      +36     
==========================================
+ Hits         1756     1792      +36     
  Misses         38       38              
Impacted Files Coverage Δ
src/rpp/rpp/operators/buffer.hpp 100.00% <ø> (ø)
...pp/rpp/operators/details/subscriber_with_state.hpp 100.00% <ø> (ø)
src/rpp/rpp/observers/dynamic_observer.hpp 100.00% <100.00%> (ø)
src/rpp/rpp/observers/specific_observer.hpp 100.00% <100.00%> (ø)
src/rpp/rpp/observers/state_observer.hpp 100.00% <100.00%> (ø)
src/rpp/rpp/operators/fwd/subscribe.hpp 100.00% <100.00%> (ø)

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ clang-tidy found issue(s) with the introduced code (1/1)

requires (!std::is_same_v<std::decay_t<TObserver>, type_erased_observer<T, StateSize, StateAlignment>> &&
sizeof(type_erased_observer_state<T, std::decay_t<TObserver>>) == StateSize &&
alignof(type_erased_observer_state<T, std::decay_t<TObserver>>) == StateAlignment)
type_erased_observer(TObserver&& obs)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ bugprone-forwarding-reference-overload ⚠️
constructor accepting a forwarding reference can hide the copy and move constructors

template<constraint::on_next_fn<T> OnNext = utils::empty_function_t<T>,
constraint::on_error_fn OnError = utils::rethrow_error_t,
constraint::on_completed_fn OnCompleted = utils::empty_function_t<>>
dynamic_observer(OnNext&& on_next = {}, OnError&& on_error = {}, OnCompleted&& on_completed = {})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ bugprone-forwarding-reference-overload ⚠️
constructor accepting a forwarding reference can hide the copy and move constructors

requires (!std::is_same_v<std::decay_t<TObserver>, dynamic_state_observer<T, States...>>)
dynamic_state_observer(TObserver&& obs)
requires (!std::is_same_v<std::decay_t<TObserver>, dynamic_observer<T>>)
dynamic_observer(TObserver&& obs)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ bugprone-forwarding-reference-overload ⚠️
constructor accepting a forwarding reference can hide the copy and move constructors

@github-actions

github-actions Bot commented Jan 11, 2023

Copy link
Copy Markdown
Contributor

BENCHMARK RESULTS (AUTOGENERATED)

ci-macos

Observable construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable construction 1.88ns 0.279113 6.75 0.56ns
Dynamic observable construction 72.96ns 76.6756 0.95 106.81ns
Specific observable construction + as_dynamic 72.46ns 72.1524 1.00 113.72ns

Observable lift

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable lift specific observer 166.15ns 131.917 1.26 1096.34ns
Specific observable lift dynamic observer 156.23ns 163.498 0.96 1149.24ns
Dynamic observable lift specific observer 263.64ns 268.868 0.98 1543.85ns
Dynamic observable lift dynamic observer 256.64ns 212.062 1.21 1262.34ns

Observable subscribe

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe specific observer 129.34ns 134.496 0.96 1109.53ns
Specific observable subscribe dynamic observer 112.96ns 127.316 0.89 1136.37ns
Dynamic observable subscribe specific observer 226.99ns 222.584 1.02 1759.48ns
Dynamic observable subscribe dynamic observer 164.31ns 168.252 0.98 1111.80ns

Observable subscribe #2

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe lambda 104.03ns 115.536 0.90 1096.27ns
Dynamic observable subscribe lambda 215.80ns 213.241 1.01 1289.65ns
Specific observable subscribe lambda without subscription 115.38ns 106.175 1.09 1137.06ns
Dynamic observable subscribe lambda without subscription 718.62ns 206.038 3.49 1248.53ns
Specific observable subscribe specific subscriber 29.01ns 30.041 0.97 825.77ns
Dynamic observable subscribe specific subscriber 132.09ns 132.306 1.00 949.54ns
Specific observable subscribe dynamic observer 35.09ns 32.6666 1.07 801.32ns
Dynamic observable subscribe dynamic observer 73.22ns 103.005 0.71 941.40ns

Observer construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer construction 2.11ns 0.279209 7.54 0.28ns
Dynamic observer construction 73.17ns 90.4257 0.81 103.44ns
Specific observer construction + as_dynamic 73.73ns 74.8932 0.98 98.65ns

OnNext

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer OnNext 2.01ns 0.786286 2.55 0.79ns
Dynamic observer OnNext 3.68ns 2.14655 1.71 2.86ns

Subscriber construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Make subsriber 84.10ns 75.1669 1.12 300.06ns
Make copy of subscriber 14.29ns 12.2524 1.17 24.38ns
Transform subsriber to dynamic 85.26ns 82.7585 1.03 140.87ns

Subscription

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
composite_subscription create 71.55ns 70.3482 1.02 299.50ns
composite_subscription add 196.26ns 61.8728 3.17 102.06ns
composite_subscription unsubscribe 86.17ns 70.8025 1.22 77.90ns

buffer

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
buffer 1359.96ns 1421.05 0.96 3075.84ns
sending of values from observable via buffer to subscriber 9.03ns 13.0322 0.69 92.75ns

chains creation test

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
long non-state chain creation + subscribe 258.39ns 217.548 1.19 1316.20ns
long stateful chain creation + subscribe 580.74ns 533.042 1.09 2748.23ns

combine_latest

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
combine_latest construction from observable via dot + subscribe 1532.62ns 1379.63 1.11 .
sending of values from observable via combine_latest to subscriber 23.76ns 23.4083 1.01 .

concat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
concat 8445.51ns 4121.89 2.05 9586.77ns
concat_with 4538.04ns 4122.66 1.10 10606.80ns

distinct_until_changed

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
distinct_until_changed construction from observable via dot + subscribe 152.31ns 151.373 1.01 915.25ns
sending of values from observable via distinct_until_changed to subscriber 5.08ns 2.23588 2.27 1.25ns

first

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
first construction from observable via dot + subscribe 204.58ns 193.216 1.06 2290.83ns
sending of values from observable via first to subscriber 2.64ns 0.557867 4.73 0.92ns

foundamental sources

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
empty 174.08ns 117.488 1.48 2141.13ns
error 115.08ns 116.785 0.99 2328.37ns
never 33.30ns 32.1619 1.04 830.39ns

from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
from vector with int 1280.22ns 757.538 1.69 2286.23ns

immediate scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 2.15ns 2.24285 0.96 406.38ns
re-schedule 10 times 27.22ns 25.727 1.06 472.49ns

just

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
just send int 523.35ns 432.542 1.21 2184.12ns
just send variadic 1675.61ns 1672.93 1.00 2502.84ns

last

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
last construction from observable via dot + subscribe 283.74ns 287.38 0.99 1265.05ns
sending of values from observable via last to subscriber 4.81ns 6.37668 0.75 1.26ns

map

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
map construction from observable via dot + subscribe 74.56ns 65.9347 1.13 871.72ns
sending of values from observable via map to subscriber 4.81ns 1.11586 4.31 1.78ns

merge

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
merge 4321.58ns 4155.39 1.04 11538.00ns
merge_with 4174.70ns 4041.16 1.03 14199.40ns

observe_on

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
observe_on construction from observable via dot + subscribe 1205.94ns 1163.65 1.04 20383.10ns
sending of values from observable via observe_on to subscriber 225.64ns 215.378 1.05 790.98ns

on_error_resume_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_error_resume_next construction from observable via dot + subscribe 574.10ns 590.597 0.97 1536.93ns

publish_subject callbacks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_next 21.56ns 21.134 1.02 28.08ns
on_error 0.94ns 0.560996 1.68 18.81ns
on_completed 0.88ns 0.560947 1.57 2.26ns

publish_subject routines

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
construct 341.16ns 642.55 0.53 546.39ns
get_observable 26.88ns 26.6124 1.01 160.74ns
get_subscriber 54.01ns 53.8332 1.00 79.93ns

repeat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
repeat construction from observable via dot + subscribe 5662.24ns 5468.89 1.04 9957.20ns

scan

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
scan construction from observable via dot + subscribe 156.47ns 145.474 1.08 1156.59ns
sending of values from observable via scan to subscriber 6.28ns 3.02426 2.08 2.09ns

single-threaded locks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no-lock increment 1.80ns 3.1477 0.57 .
mutex lock increment 23.33ns 22.8717 1.02 .
spin-lock increment 8.25ns 14.3789 0.57 .

skip

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
skip construction from observable via dot + subscribe 145.30ns 139.334 1.04 1444.50ns
sending of values from observable via skip to subscriber 4.98ns 3.1375 1.59 2.03ns

switch_on_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
switch_on_next construction from observable via dot + subscribe 4982.34ns 4892.26 1.02 9819.36ns
sending of values from observable via switch_on_next to subscriber 967.50ns 987.863 0.98 2568.87ns

take

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take construction from observable via dot + subscribe 196.56ns 334.725 0.59 2280.45ns
sending of values from observable via take to subscriber 6.74ns 3.58657 1.88 5.61ns

take_last

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take_last construction from observable via dot + subscribe 318.23ns 530.931 0.60 2154.91ns
sending of values from observable via take_last to subscriber 4.69ns 2.8051 1.67 5.35ns

take_until

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take_until construction from observable via dot + subscribe 2382.89ns 2355.71 1.01 4598.16ns
sending of values from observable via take_until to subscriber 12.58ns 13.748 0.91 2.35ns

timeout

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
timeout construction from observable via dot + subscribe with run_loop 6237.57ns 6805.82 0.92 4812.20ns
sending of values from observable via timeout to subscriber with unreachable timeout interval with run_loop 73.76ns 72.7318 1.01 993.27ns

trampoline scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 30.48ns 29.922 1.02 667.72ns
re-schedule 10 times 88.81ns 94.3211 0.94 655.30ns
recursively schedule 10 times 2037.82ns 1990.94 1.02 16094.60ns

window

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
window 4814.32ns 4002.8 1.20 8279.07ns
sending of values from observable via window to subscriber 844.85ns 958.336 0.88 1491.92ns

with_latest_from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
with_latest_from construction from observable via dot + subscribe 1614.84ns 1685.27 0.96 .
sending of values from observable via with_latest_from to subscriber 31.88ns 23.1339 1.38 .

ci-ubuntu-clang

Observable construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable construction 0.40ns 0.335131 1.20 0.40ns
Dynamic observable construction 19.27ns 18.5818 1.04 29.86ns
Specific observable construction + as_dynamic 18.94ns 18.8043 1.01 29.44ns

Observable lift

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable lift specific observer 56.21ns 50.3603 1.12 338.35ns
Specific observable lift dynamic observer 53.08ns 50.8102 1.04 356.23ns
Dynamic observable lift specific observer 87.10ns 85.2595 1.02 387.75ns
Dynamic observable lift dynamic observer 78.49ns 75.6188 1.04 371.46ns

Observable subscribe

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe specific observer 36.52ns 36.6288 1.00 333.60ns
Specific observable subscribe dynamic observer 34.70ns 37.3093 0.93 338.30ns
Dynamic observable subscribe specific observer 66.66ns 70.2825 0.95 380.94ns
Dynamic observable subscribe dynamic observer 59.50ns 60.4367 0.98 348.45ns

Observable subscribe #2

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe lambda 34.62ns 36.9314 0.94 330.62ns
Dynamic observable subscribe lambda 61.61ns 64.8558 0.95 373.05ns
Specific observable subscribe lambda without subscription 33.96ns 36.542 0.93 330.56ns
Dynamic observable subscribe lambda without subscription 60.86ns 64.8341 0.94 371.46ns
Specific observable subscribe specific subscriber 13.26ns 13.7173 0.97 276.57ns
Dynamic observable subscribe specific subscriber 40.54ns 42.9321 0.94 319.10ns
Specific observable subscribe dynamic observer 13.28ns 13.7365 0.97 287.29ns
Dynamic observable subscribe dynamic observer 36.90ns 33.7434 1.09 295.87ns

Observer construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer construction 1.61ns 0.335157 4.79 0.40ns
Dynamic observer construction 20.07ns 18.4706 1.09 25.01ns
Specific observer construction + as_dynamic 20.09ns 17.9551 1.12 24.62ns

OnNext

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer OnNext 1.61ns 0.670203 2.40 0.44ns
Dynamic observer OnNext 2.81ns 2.00734 1.40 2.01ns

Subscriber construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Make subsriber 21.95ns 19.8639 1.10 62.10ns
Make copy of subscriber 10.45ns 6.95542 1.50 10.67ns
Transform subsriber to dynamic 22.77ns 20.697 1.10 28.87ns

Subscription

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
composite_subscription create 23.28ns 20.224 1.15 56.13ns
composite_subscription add 21.36ns 17.7861 1.20 89.99ns
composite_subscription unsubscribe 27.07ns 30.1336 0.90 26.85ns

buffer

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
buffer 754.64ns 766.184 0.98 1979.59ns
sending of values from observable via buffer to subscriber 7.06ns 5.02488 1.41 24.28ns

chains creation test

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
long non-state chain creation + subscribe 143.23ns 102.498 1.40 597.69ns
long stateful chain creation + subscribe 203.20ns 145.079 1.40 1427.14ns

combine_latest

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
combine_latest construction from observable via dot + subscribe 474.51ns 455.492 1.04 .
sending of values from observable via combine_latest to subscriber 9.42ns 8.01816 1.17 .

concat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
concat 1934.44ns 1786.49 1.08 3899.14ns
concat_with 1669.45ns 1555.52 1.07 4361.83ns

distinct_until_changed

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
distinct_until_changed construction from observable via dot + subscribe 55.11ns 52.0928 1.06 314.40ns
sending of values from observable via distinct_until_changed to subscriber 2.81ns 1.67714 1.67 1.61ns

first

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
first construction from observable via dot + subscribe 82.78ns 82.3694 1.00 748.92ns
sending of values from observable via first to subscriber 0.40ns 0.336162 1.20 0.60ns

foundamental sources

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
empty 37.30ns 36.4263 1.02 716.20ns
error 80.84ns 81.2524 0.99 782.68ns
never 14.48ns 14.4657 1.00 284.02ns

from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
from vector with int 230.93ns 239.46 0.96 748.87ns

immediate scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 0.80ns 0.903482 0.89 125.21ns
re-schedule 10 times 7.23ns 9.03363 0.80 161.76ns

just

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
just send int 194.60ns 208.529 0.93 713.61ns
just send variadic 1143.74ns 1203.32 0.95 791.62ns

last

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
last construction from observable via dot + subscribe 110.97ns 114.335 0.97 450.72ns
sending of values from observable via last to subscriber 3.21ns 2.34756 1.37 1.21ns

map

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
map construction from observable via dot + subscribe 51.72ns 30.3811 1.70 303.25ns
sending of values from observable via map to subscriber 8.03ns 0.847597 9.48 2.12ns

merge

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
merge 1861.51ns 1731.08 1.08 3824.62ns
merge_with 1678.45ns 1546.57 1.09 4215.42ns

observe_on

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
observe_on construction from observable via dot + subscribe 549.81ns 551.564 1.00 2731.36ns
sending of values from observable via observe_on to subscriber 125.88ns 129.22 0.97 243.51ns

on_error_resume_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_error_resume_next construction from observable via dot + subscribe 225.09ns 233.195 0.97 750.35ns

publish_subject callbacks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_next 20.70ns 19.1515 1.08 12.83ns
on_error 0.81ns 1.01414 0.80 18.99ns
on_completed 0.81ns 1.00941 0.80 0.81ns

publish_subject routines

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
construct 110.75ns 118.978 0.93 161.67ns
get_observable 10.68ns 7.89209 1.35 49.17ns
get_subscriber 29.69ns 19.6906 1.51 24.23ns

repeat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
repeat construction from observable via dot + subscribe 2088.65ns 2182.6 0.96 3498.99ns

scan

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
scan construction from observable via dot + subscribe 49.61ns 46.0236 1.08 396.38ns
sending of values from observable via scan to subscriber 4.82ns 1.67258 2.88 1.69ns

single-threaded locks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no-lock increment 3.12ns 1.99016 1.57 .
mutex lock increment 6.61ns 8.0415 0.82 .
spin-lock increment 10.46ns 9.12011 1.15 .

skip

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
skip construction from observable via dot + subscribe 51.22ns 45.6164 1.12 554.42ns
sending of values from observable via skip to subscriber 3.21ns 1.67532 1.92 2.55ns

switch_on_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
switch_on_next construction from observable via dot + subscribe 2008.87ns 1841.4 1.09 3672.01ns
sending of values from observable via switch_on_next to subscriber 524.25ns 4579.6 0.11 868.72ns

take

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take construction from observable via dot + subscribe 83.12ns 81.8632 1.02 605.68ns
sending of values from observable via take to subscriber 4.42ns 2.34605 1.89 2.36ns

take_last

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take_last construction from observable via dot + subscribe 113.05ns 115.677 0.98 650.64ns
sending of values from observable via take_last to subscriber 3.31ns 2.36083 1.40 3.81ns

take_until

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take_until construction from observable via dot + subscribe 933.91ns 874.839 1.07 1511.40ns
sending of values from observable via take_until to subscriber 12.03ns 8.71932 1.38 2.13ns

timeout

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
timeout construction from observable via dot + subscribe with run_loop 838.59ns 792.076 1.06 15235.10ns
sending of values from observable via timeout to subscriber with unreachable timeout interval with run_loop 46.53ns 41.4548 1.12 18432.40ns

trampoline scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 7.06ns 7.88637 0.89 185.54ns
re-schedule 10 times 24.89ns 27.8072 0.90 214.62ns
recursively schedule 10 times 1286.44ns 1420.79 0.91 7687.27ns

window

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
window 1646.39ns 1594.97 1.03 3387.54ns
sending of values from observable via window to subscriber 278.21ns 264.065 1.05 406.05ns

with_latest_from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
with_latest_from construction from observable via dot + subscribe 542.00ns 540.517 1.00 .
sending of values from observable via with_latest_from to subscriber 9.27ns 8.81874 1.05 .

ci-ubuntu-gcc

Observable construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable construction 0.40ns 0.375776 1.08 0.37ns
Dynamic observable construction 38.97ns 33.4096 1.17 62.44ns
Specific observable construction + as_dynamic 39.05ns 36.1118 1.08 62.77ns

Observable lift

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable lift specific observer 125.03ns 122.669 1.02 878.61ns
Specific observable lift dynamic observer 144.87ns 149.203 0.97 944.19ns
Dynamic observable lift specific observer 222.05ns 211.938 1.05 1006.31ns
Dynamic observable lift dynamic observer 222.38ns 244.349 0.91 977.95ns

Observable subscribe

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe specific observer 80.33ns 70.3299 1.14 845.43ns
Specific observable subscribe dynamic observer 96.85ns 92.3954 1.05 898.60ns
Dynamic observable subscribe specific observer 155.32ns 141.062 1.10 955.92ns
Dynamic observable subscribe dynamic observer 156.73ns 153.361 1.02 903.13ns

Observable subscribe #2

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe lambda 74.62ns 70.818 1.05 880.71ns
Dynamic observable subscribe lambda 159.48ns 157.563 1.01 980.27ns
Specific observable subscribe lambda without subscription 77.27ns 71.7615 1.08 870.19ns
Dynamic observable subscribe lambda without subscription 156.80ns 150.47 1.04 977.24ns
Specific observable subscribe specific subscriber 36.82ns 35.2654 1.04 731.84ns
Dynamic observable subscribe specific subscriber 114.06ns 112.755 1.01 811.07ns
Specific observable subscribe dynamic observer 36.16ns 35.9291 1.01 739.85ns
Dynamic observable subscribe dynamic observer 100.93ns 100.067 1.01 773.88ns

Observer construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer construction 0.78ns 0.404165 1.92 0.40ns
Dynamic observer construction 37.59ns 33.9506 1.11 54.43ns
Specific observer construction + as_dynamic 39.97ns 35.2693 1.13 57.22ns

OnNext

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer OnNext 2.01ns 0.380798 5.28 0.40ns
Dynamic observer OnNext 2.86ns 2.32684 1.23 2.39ns

Subscriber construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Make subsriber 43.91ns 42.9384 1.02 163.50ns
Make copy of subscriber 19.95ns 19.758 1.01 37.04ns
Transform subsriber to dynamic 59.64ns 49.7084 1.20 93.83ns

Subscription

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
composite_subscription create 42.22ns 39.1849 1.08 154.31ns
composite_subscription add 55.77ns 57.6139 0.97 127.86ns
composite_subscription unsubscribe 49.79ns 50.3817 0.99 46.02ns

buffer

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
buffer 1103.11ns 1038.62 1.06 3561.99ns
sending of values from observable via buffer to subscriber 12.68ns 7.08022 1.79 36.42ns

chains creation test

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
long non-state chain creation + subscribe 371.06ns 355.264 1.04 1662.58ns
long stateful chain creation + subscribe 526.46ns 523.353 1.01 5234.22ns

combine_latest

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
combine_latest construction from observable via dot + subscribe 1089.48ns 1075.89 1.01 .
sending of values from observable via combine_latest to subscriber 12.51ns 11.1534 1.12 .

concat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
concat 3767.37ns 3504.02 1.08 9113.05ns
concat_with 3385.42ns 3346.82 1.01 9695.80ns

distinct_until_changed

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
distinct_until_changed construction from observable via dot + subscribe 147.59ns 149.661 0.99 901.15ns
sending of values from observable via distinct_until_changed to subscriber 7.10ns 2.87762 2.47 1.61ns

first

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
first construction from observable via dot + subscribe 211.54ns 206.047 1.03 2046.00ns
sending of values from observable via first to subscriber 3.13ns 0.777266 4.03 1.21ns

foundamental sources

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
empty 81.51ns 83.5839 0.98 2103.95ns
error 140.09ns 133.703 1.05 2110.48ns
never 37.57ns 40.0928 0.94 758.87ns

from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
from vector with int 386.83ns 405.107 0.95 2103.71ns

immediate scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 1.91ns 1.06448 1.79 337.72ns
re-schedule 10 times 27.05ns 29.0529 0.93 369.33ns

just

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
just send int 366.51ns 366.257 1.00 2107.95ns
just send variadic 1714.79ns 1647.61 1.04 2143.13ns

last

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
last construction from observable via dot + subscribe 263.30ns 256.326 1.03 1170.16ns
sending of values from observable via last to subscriber 7.25ns 3.52399 2.06 2.01ns

map

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
map construction from observable via dot + subscribe 107.36ns 93.9435 1.14 901.80ns
sending of values from observable via map to subscriber 5.65ns 0.904417 6.25 2.81ns

merge

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
merge 3466.55ns 3681.91 0.94 10864.00ns
merge_with 3364.97ns 3564.02 0.94 10726.50ns

observe_on

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
observe_on construction from observable via dot + subscribe 961.27ns 988.165 0.97 3916.98ns
sending of values from observable via observe_on to subscriber 182.75ns 172.204 1.06 621.02ns

on_error_resume_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_error_resume_next construction from observable via dot + subscribe 535.95ns 543.312 0.99 1850.64ns

publish_subject callbacks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_next 28.34ns 27.3717 1.04 18.66ns
on_error 1.62ns 0.732448 2.21 20.27ns
on_completed 0.81ns 0.765834 1.06 1.22ns

publish_subject routines

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
construct 237.46ns 275.04 0.86 449.54ns
get_observable 34.28ns 35.3004 0.97 118.00ns
get_subscriber 71.77ns 63.2372 1.13 114.68ns

repeat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
repeat construction from observable via dot + subscribe 5002.50ns 5858.45 0.85 8415.54ns

scan

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
scan construction from observable via dot + subscribe 137.04ns 158.377 0.87 1087.87ns
sending of values from observable via scan to subscriber 9.55ns 2.81699 3.39 1.91ns

single-threaded locks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no-lock increment 2.28ns 2.58013 0.88 .
mutex lock increment 9.24ns 8.46292 1.09 .
spin-lock increment 10.86ns 14.2013 0.76 .

skip

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
skip construction from observable via dot + subscribe 147.32ns 155.329 0.95 1303.26ns
sending of values from observable via skip to subscriber 7.19ns 3.14706 2.28 2.81ns

switch_on_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
switch_on_next construction from observable via dot + subscribe 4114.29ns 3746.51 1.10 12810.70ns
sending of values from observable via switch_on_next to subscriber 985.20ns 940.639 1.05 3531.93ns

take

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take construction from observable via dot + subscribe 214.56ns 291.639 0.74 1621.70ns
sending of values from observable via take to subscriber 9.33ns 4.34892 2.15 4.19ns

take_last

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take_last construction from observable via dot + subscribe 257.50ns 245.439 1.05 1686.23ns
sending of values from observable via take_last to subscriber 7.30ns 3.87188 1.88 7.19ns

take_until

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take_until construction from observable via dot + subscribe 1993.36ns 1942.66 1.03 4166.33ns
sending of values from observable via take_until to subscriber 16.31ns 13.1718 1.24 2.82ns

timeout

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
timeout construction from observable via dot + subscribe with run_loop 1315.27ns 1369.31 0.96 16679.70ns
sending of values from observable via timeout to subscriber with unreachable timeout interval with run_loop 72.66ns 65.0374 1.12 2820.37ns

trampoline scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 25.93ns 23.5254 1.10 435.51ns
re-schedule 10 times 62.09ns 49.3086 1.26 482.97ns
recursively schedule 10 times 1740.17ns 1670.26 1.04 22642.90ns

window

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
window 3336.97ns 3370.38 0.99 7106.38ns
sending of values from observable via window to subscriber 640.93ns 680.538 0.94 1077.21ns

with_latest_from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
with_latest_from construction from observable via dot + subscribe 1336.90ns 1323.53 1.01 .
sending of values from observable via with_latest_from to subscriber 13.51ns 11.5037 1.17 .

ci-windows

Observable construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable construction 1.33ns 2.00968 0.66 0.59ns
Dynamic observable construction 71.10ns 72.3931 0.98 108.92ns
Specific observable construction + as_dynamic 70.47ns 71.5043 0.99 109.64ns

Observable lift

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable lift specific observer 143.05ns 135.939 1.05 1072.24ns
Specific observable lift dynamic observer 158.86ns 169.877 0.94 1121.40ns
Dynamic observable lift specific observer 252.25ns 265.585 0.95 1287.06ns
Dynamic observable lift dynamic observer 210.37ns 232.972 0.90 1166.53ns

Observable subscribe

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe specific observer 117.46ns 100.348 1.17 1041.77ns
Specific observable subscribe dynamic observer 117.03ns 118.052 0.99 1315.67ns
Dynamic observable subscribe specific observer 212.71ns 207.75 1.02 1197.16ns
Dynamic observable subscribe dynamic observer 160.79ns 171.91 0.94 1099.33ns

Observable subscribe #2

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observable subscribe lambda 99.90ns 98.25 1.02 1355.09ns
Dynamic observable subscribe lambda 205.74ns 205.298 1.00 1199.84ns
Specific observable subscribe lambda without subscription 100.53ns 98.3452 1.02 1037.36ns
Dynamic observable subscribe lambda without subscription 207.59ns 207.692 1.00 1193.00ns
Specific observable subscribe specific subscriber 26.91ns 26.4979 1.02 756.48ns
Dynamic observable subscribe specific subscriber 130.90ns 131.644 0.99 908.42ns
Specific observable subscribe dynamic observer 26.91ns 26.485 1.02 782.93ns
Dynamic observable subscribe dynamic observer 69.53ns 78.7238 0.88 997.29ns

Observer construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer construction 6.78ns 2.1076 3.22 1.33ns
Dynamic observer construction 71.53ns 72.1111 0.99 100.19ns
Specific observer construction + as_dynamic 74.11ns 71.8246 1.03 99.82ns

OnNext

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Specific observer OnNext 1.82ns 0.44032 4.13 0.59ns
Dynamic observer OnNext 2.37ns 2.00804 1.18 1.51ns

Subscriber construction

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
Make subsriber 77.82ns 72.6401 1.07 310.38ns
Make copy of subscriber 15.38ns 16.0423 0.96 27.73ns
Transform subsriber to dynamic 85.89ns 86.6748 0.99 134.51ns

Subscription

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
composite_subscription create 76.12ns 73.6294 1.03 301.33ns
composite_subscription add 63.00ns 67.2452 0.94 141.28ns
composite_subscription unsubscribe 56.35ns 61.9353 0.91 111.67ns

buffer

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
buffer 977.65ns 1035.12 0.94 3977.00ns
sending of values from observable via buffer to subscriber 7.64ns 7.41839 1.03 101.81ns

chains creation test

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
long non-state chain creation + subscribe 294.31ns 296.225 0.99 1543.57ns
long stateful chain creation + subscribe 595.83ns 654.361 0.91 2812.25ns

combine_latest

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
combine_latest construction from observable via dot + subscribe 1477.73ns 1529.75 0.97 .
sending of values from observable via combine_latest to subscriber 31.30ns 35.8041 0.87 .

concat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
concat 3742.00ns 4033.83 0.93 9371.67ns
concat_with 5102.33ns 4204.17 1.21 10611.00ns

distinct_until_changed

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
distinct_until_changed construction from observable via dot + subscribe 169.72ns 176.029 0.96 923.32ns
sending of values from observable via distinct_until_changed to subscriber 3.88ns 3.23416 1.20 3.77ns

first

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
first construction from observable via dot + subscribe 201.23ns 217.118 0.93 2309.00ns
sending of values from observable via first to subscriber 2.07ns 2.02735 1.02 1.58ns

foundamental sources

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
empty 57.38ns 63.4333 0.90 2151.20ns
error 103.48ns 120.889 0.86 2195.90ns
never 27.56ns 27.9085 0.99 785.27ns

from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
from vector with int 457.22ns 499.34 0.92 2178.90ns

immediate scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 1.49ns 1.60809 0.93 361.38ns
re-schedule 10 times 87.34ns 130.393 0.67 385.73ns

just

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
just send int 335.86ns 374.258 0.90 2113.18ns
just send variadic 1157.11ns 1293.65 0.89 2187.50ns

last

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
last construction from observable via dot + subscribe 290.17ns 295.026 0.98 1273.47ns
sending of values from observable via last to subscriber 4.22ns 4.36926 0.97 2.95ns

map

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
map construction from observable via dot + subscribe 93.39ns 92.5802 1.01 886.19ns
sending of values from observable via map to subscriber 5.59ns 3.59567 1.56 7.00ns

merge

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
merge 3726.17ns 7112.14 0.52 9618.67ns
merge_with 3769.67ns 4111.17 0.92 10302.70ns

observe_on

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
observe_on construction from observable via dot + subscribe 1094.10ns 1197.29 0.91 7576.60ns
sending of values from observable via observe_on to subscriber 198.25ns 194.161 1.02 705.03ns

on_error_resume_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_error_resume_next construction from observable via dot + subscribe 575.87ns 616.949 0.93 1618.00ns

publish_subject callbacks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
on_next 17.75ns 22.9955 0.77 28.85ns
on_error 2.10ns 2.44438 0.86 16.31ns
on_completed 2.40ns 2.86775 0.84 0.60ns

publish_subject routines

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
construct 323.46ns 335.339 0.96 531.68ns
get_observable 23.05ns 31.7087 0.73 203.41ns
get_subscriber 51.67ns 61.935 0.83 82.75ns

repeat

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
repeat construction from observable via dot + subscribe 5452.00ns 5909.4 0.92 10007.70ns

scan

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
scan construction from observable via dot + subscribe 170.84ns 168.154 1.02 1115.90ns
sending of values from observable via scan to subscriber 6.03ns 5.74816 1.05 7.86ns

single-threaded locks

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no-lock increment 1.65ns 2.81144 0.59 .
mutex lock increment 22.75ns 24.0078 0.95 .
spin-lock increment 7.97ns 10.7082 0.74 .

skip

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
skip construction from observable via dot + subscribe 165.54ns 166.741 0.99 1370.29ns
sending of values from observable via skip to subscriber 3.86ns 3.22185 1.20 3.09ns

switch_on_next

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
switch_on_next construction from observable via dot + subscribe 4376.60ns 4628.5 0.95 10788.50ns
sending of values from observable via switch_on_next to subscriber 997.63ns 1092.9 0.91 2755.88ns

take

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take construction from observable via dot + subscribe 206.15ns 224.398 0.92 1906.18ns
sending of values from observable via take to subscriber 6.26ns 5.46745 1.15 5.77ns

take_last

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take_last construction from observable via dot + subscribe 294.35ns 307.68 0.96 2228.00ns
sending of values from observable via take_last to subscriber 4.25ns 4.45248 0.96 17.92ns

take_until

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
take_until construction from observable via dot + subscribe 2104.73ns 2274.27 0.93 4669.00ns
sending of values from observable via take_until to subscriber 12.52ns 12.5814 1.00 5.07ns

timeout

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
timeout construction from observable via dot + subscribe with run_loop 1523.77ns 1610.23 0.95 4893.25ns
sending of values from observable via timeout to subscriber with unreachable timeout interval with run_loop 50.55ns 58.4382 0.86 1203.27ns

trampoline scheduler

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
no any re-schedule 17.77ns 18.6165 0.95 549.92ns
re-schedule 10 times 107.66ns 144.52 0.74 574.55ns
recursively schedule 10 times 2414.90ns 2419.27 1.00 16870.00ns

window

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
window 3335.00ns 3662.0 0.91 8546.67ns
sending of values from observable via window to subscriber 753.37ns 821.581 0.92 1459.31ns

with_latest_from

Table
Test Name Current, ns Prev, ns Ratio RxCpp current, ns
with_latest_from construction from observable via dot + subscribe 1899.67ns 1872.38 1.01 .
sending of values from observable via with_latest_from to subscriber 25.38ns 31.3294 0.81 .

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ clang-tidy found issue(s) with the introduced code (1/1)

{
auto empty_observer = rpp::specific_observer<int>{};

CHECK(sizeof(empty_observer) == 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ performance-unnecessary-value-param ⚠️
the parameter sub is copied for each invocation but only used as a const reference; consider making it a const reference

Suggested change
auto state_observer = rpp::details::state_observer_base{[](int v, rpp::dynamic_subscriber<int> sub)
auto state_observer = rpp::details::state_observer_base{[](int v, const rpp::dynamic_subscriber<int> sub)

{
auto empty_observer = rpp::specific_observer<int>{};

CHECK(sizeof(empty_observer) == 1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ performance-unnecessary-value-param ⚠️
the parameter sub is copied for each invocation but only used as a const reference; consider making it a const reference

Suggested change
auto state_observer = rpp::details::state_observer_base{[](int v, rpp::dynamic_subscriber<int> sub)
auto state_observer = rpp::details::state_observer_base{[](int v, rpp::dynamic_subscriber<int>& sub)

@sonarqubecloud

Copy link
Copy Markdown

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 15 Code Smells

0.0% 0.0% Coverage
0.0% 0.0% Duplication

@AlexInLog AlexInLog closed this Apr 3, 2023
@AlexInLog AlexInLog deleted the type_erasure_v2 branch April 3, 2023 07:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant