Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Check performance of guarded delegate calls #20

Closed
ZacSweers opened this issue May 13, 2019 · 3 comments · Fixed by #43
Closed

Check performance of guarded delegate calls #20

ZacSweers opened this issue May 13, 2019 · 3 comments · Fixed by #43
Labels
Performance Performance implications

Comments

@ZacSweers
Copy link
Collaborator

Requires #17 to be done to add some benchmarking for comparison. If it's expensive, consider putting behind a config

@ShaishavGandhi
Copy link
Collaborator

Some preliminary results from putting guarded delegate behind a config.

Event throughput: grouped by number of events:

1 item (observable)
RxDogTagAndroidPerf.observable1_false                                                 302ns    0.000ms
RxDogTagAndroidPerf.observable1_true_withoutGuardedDelegate                        15,980ns    0.016ms  5191.39%
RxDogTagAndroidPerf.observable1_true                                               16,681ns    0.017ms  5423.51%

1 item (flowable)
RxDogTagAndroidPerf.flowable1_false                                                   452ns    0.000ms
RxDogTagAndroidPerf.flowable1_true_withoutGuardedDelegate                          16,214ns    0.016ms  3487.17%
RxDogTagAndroidPerf.flowable1_true                                                 16,821ns    0.017ms  3621.46%

1000 items (observable)
RxDogTagAndroidPerf.observable1000_false                                           27,873ns   0.028ms
RxDogTagAndroidPerf.observable1000_true_withoutGuardedDelegate                     50,833ns   0.051ms  82.37%
RxDogTagAndroidPerf.observable1000_true                                           242,344ns   0.242ms  769.46%

1000 items (flowable)
RxDogTagAndroidPerf.flowable1000_false                                             28,783ns   0.029ms
RxDogTagAndroidPerf.flowable1000_true_withoutGuardedDelegate                       51,597ns   0.052ms  79.26%
RxDogTagAndroidPerf.flowable1000_true                                             207,969ns   0.208ms  622.54%

1000000 items (observable)
RxDogTagAndroidPerf.observable1000000_false                                    27,728,336ns  27.728ms
RxDogTagAndroidPerf.observable1000000_true_withoutGuardedDelegate              36,405,368ns  36.405ms    31.29%
RxDogTagAndroidPerf.observable1000000_true                                    274,318,622ns  274.319ms   889.31%

1000000 items (flowable)
RxDogTagAndroidPerf.flowable1000000_false                                      28,777,451ns  28.777ms
RxDogTagAndroidPerf.flowable1000000_true_withoutGuardedDelegate                36,235,889ns  36.236ms    25.92%
RxDogTagAndroidPerf.flowable1000000_true                                      218,021,428ns  218.021ms   657.61%

Subscribe cost: grouped by complexity:

Simple (observable)
RxDogTagAndroidPerf.observable_false_subscribe_simple                                 220ns    0.000ms
RxDogTagAndroidPerf.observable_true_subscribe_simple_withoutGuardedDelegate        15,845ns    0.016ms  7102.27%
RxDogTagAndroidPerf.observable_true_subscribe_simple                               15,951ns    0.016ms  7150.45%

Simple (flowable)
RxDogTagAndroidPerf.flowable_false_subscribe_simple                                   201ns    0.000ms
RxDogTagAndroidPerf.flowable_true_subscribe_simple                                 15,928ns    0.016ms  7824.38%
RxDogTagAndroidPerf.flowable_true_subscribe_simple_withoutGuardedDelegate          15,935ns    0.016ms  7827.86%

Complex (observable)
RxDogTagAndroidPerf.observable_false_subscribe_complex                              2,843ns   0.003ms
RxDogTagAndroidPerf.observable_true_subscribe_complex                              22,103ns   0.022ms  677.45%
RxDogTagAndroidPerf.observable_true_subscribe_complex_withoutGuardedDelegate       25,474ns   0.025ms  796.03%

Complex (flowable)
RxDogTagAndroidPerf.flowable_true_subscribe_complex                                29,057ns   0.029ms
RxDogTagAndroidPerf.flowable_true_subscribe_complex_withoutGuardedCall             37,796ns   0.038ms  30.08%
RxDogTagAndroidPerf.flowable_false_subscribe_complex                               70,442ns   0.070ms  142.43%

E2E amortized cost:

Observable
RxDogTagAndroidPerf.observable_false_e2e                                           91,770ns  0.092ms
RxDogTagAndroidPerf.observable_true_e2e_withoutGuardedDelegate                    121,980ns  0.122ms  32.92%
RxDogTagAndroidPerf.observable_true_e2e                                           141,563ns  0.142ms  54.26%

Flowable
RxDogTagAndroidPerf.flowable_false_e2e                                            115,781ns  0.116ms
RxDogTagAndroidPerf.flowable_true_e2e                                             166,822ns  0.167ms  44.08%
RxDogTagAndroidPerf.flowable_true_e2e_withoutGuardedDelegate                      173,802ns  0.174ms  50.11%

@ZacSweers
Copy link
Collaborator Author

Wowsers, so the guarded delegate calls seem to be most of the cost. This matches what I saw in some preliminary testing. We should definitely add a flag to control them in Configuration

@ZacSweers
Copy link
Collaborator Author

CC @dlew

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Performance Performance implications
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants