Skip to content

Commit

Permalink
Add option to disable guarded delegate call (#43)
Browse files Browse the repository at this point in the history
* Add option to disable guarded delegate call

* Add test for disabled guarded delegate

* Remove reference to internal method

* Rename test to be more reflective of what it's testing
  • Loading branch information
ShaishavGandhi authored Aug 15, 2019
1 parent cd2c06d commit 43c433b
Show file tree
Hide file tree
Showing 9 changed files with 305 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,17 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun flowable1_true_withoutGuardedDelegate() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val flowable = flowableInstance(1)
benchmarkRule.measureRepeated {
flowable.subscribe()
}
}

@Test
fun observable1_true() {
RxDogTag.install()
Expand All @@ -115,6 +126,17 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun observable1_true_withoutGuardedDelegate() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val observable = observableInstance(1)
benchmarkRule.measureRepeated {
observable.subscribe()
}
}

@Test
fun flowable1000_true() {
RxDogTag.install()
Expand All @@ -124,6 +146,17 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun flowable1000_true_withoutGuardedDelegate() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val flowable = flowableInstance(1_000)
benchmarkRule.measureRepeated {
flowable.subscribe()
}
}

@Test
fun observable1000_true() {
RxDogTag.install()
Expand All @@ -133,6 +166,17 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun observable1000_true_withoutGuardedDelegate() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val observable = observableInstance(1_000)
benchmarkRule.measureRepeated {
observable.subscribe()
}
}

@Test
fun flowable1000000_true() {
RxDogTag.install()
Expand All @@ -142,6 +186,17 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun flowable1000000_true_withoutGuardedDelegate() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val flowable = flowableInstance(1_000_000)
benchmarkRule.measureRepeated {
flowable.subscribe()
}
}

@Test
fun observable1000000_true() {
RxDogTag.install()
Expand All @@ -151,6 +206,17 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun observable1000000_true_withoutGuardedDelegate() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val observable = observableInstance(1_000_000)
benchmarkRule.measureRepeated {
observable.subscribe()
}
}

@Test
fun flowable_true_subscribe_simple() {
RxDogTag.install()
Expand All @@ -160,6 +226,17 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun flowable_true_subscribe_simple_withoutGuardedDelegate() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val flowable = flowableInstance(0)
benchmarkRule.measureRepeated {
flowable.subscribe()
}
}

@Test
fun observable_true_subscribe_simple() {
RxDogTag.install()
Expand All @@ -169,6 +246,17 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun observable_true_subscribe_simple_withoutGuardedDelegate() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val observable = observableInstance(0)
benchmarkRule.measureRepeated {
observable.subscribe()
}
}

@Test
fun flowable_false_subscribe_simple() {
val flowable = flowableInstance(0)
Expand Down Expand Up @@ -200,6 +288,23 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun flowable_true_subscribe_complex_withoutGuardedCall() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val flowable = flowableInstance(0)
.filter { it == 2 }
.map { it * 2 }
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.ambWith(Flowable.never())
.ignoreElements()
benchmarkRule.measureRepeated {
flowable.subscribe()
}
}

@Test
fun observable_true_subscribe_complex() {
RxDogTag.install()
Expand All @@ -215,6 +320,23 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun observable_true_subscribe_complex_withoutGuardedDelegate() {
RxDogTag.builder()
.guardObserverCallbacks(false)
.install()
val observable = observableInstance(0)
.filter { it == 2 }
.map { it * 2 }
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.ambWith(Observable.never())
.ignoreElements()
benchmarkRule.measureRepeated {
observable.subscribe()
}
}

@Test
fun flowable_false_subscribe_complex() {
val flowable = flowableInstance(0)
Expand Down Expand Up @@ -260,6 +382,26 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun flowable_true_e2e_withoutGuardedDelegate() {
RxDogTag
.builder()
.guardObserverCallbacks(false)
.install()
val flowable = flowableInstance(1_000)
.filter { it == 2 }
.map { it * 2 }
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.ambWith(Flowable.never())
.ignoreElements()
benchmarkRule.measureRepeated {
val latch = runWithTimingDisabled { CountDownLatch(1) }
flowable.subscribe { latch.countDown() }
latch.await()
}
}

@Test
fun observable_true_e2e() {
RxDogTag.install()
Expand All @@ -277,6 +419,26 @@ class RxDogTagAndroidPerf {
}
}

@Test
fun observable_true_e2e_withoutGuardedDelegate() {
RxDogTag
.builder()
.guardObserverCallbacks(false)
.install()
val observable = observableInstance(1_000)
.filter { it == 2 }
.map { it * 2 }
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.ambWith(Observable.never())
.ignoreElements()
benchmarkRule.measureRepeated {
val latch = runWithTimingDisabled { CountDownLatch(1) }
observable.subscribe { latch.countDown() }
latch.await()
}
}

@Test
fun flowable_false_e2e() {
val flowable = flowableInstance(1_000)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,43 @@ import java.util.Locale
fun main() {

val data = """
benchmark: 17,078,596 ns RxDogTagAndroidPerf.observable1000000_false
benchmark: 112 ns RxDogTagAndroidPerf.observable_false_subscribe_simple
benchmark: 13,129 ns RxDogTagAndroidPerf.flowable1_true
benchmark: 12,725 ns RxDogTagAndroidPerf.flowable_true_subscribe_simple
Timed out waiting for process to appear on google-pixel_3-89UX0H5NB.
benchmark: 17,596 ns RxDogTagAndroidPerf.observable1000_false
benchmark: 145,833 ns RxDogTagAndroidPerf.observable_true_e2e
benchmark: 152,887,724 ns RxDogTagAndroidPerf.flowable1000000_true
benchmark: 5,322 ns RxDogTagAndroidPerf.observable_false_subscribe_complex
benchmark: 212 ns RxDogTagAndroidPerf.observable1_false
benchmark: 49,184 ns RxDogTagAndroidPerf.flowable_true_subscribe_complex
benchmark: 143,646 ns RxDogTagAndroidPerf.flowable1000_true
benchmark: 17,790,262 ns RxDogTagAndroidPerf.flowable1000000_false
benchmark: 8,376 ns RxDogTagAndroidPerf.flowable_false_subscribe_complex
benchmark: 126,371 ns RxDogTagAndroidPerf.flowable_false_e2e
benchmark: 161,099,912 ns RxDogTagAndroidPerf.observable1000000_true
benchmark: 13,017 ns RxDogTagAndroidPerf.observable_true_subscribe_simple
benchmark: 25,046 ns RxDogTagAndroidPerf.observable_true_subscribe_complex
benchmark: 13,267 ns RxDogTagAndroidPerf.observable1_true
benchmark: 153,107 ns RxDogTagAndroidPerf.flowable_true_e2e
benchmark: 147 ns RxDogTagAndroidPerf.flowable_false_subscribe_simple
benchmark: 99,010 ns RxDogTagAndroidPerf.observable_false_e2e
benchmark: 223 ns RxDogTagAndroidPerf.flowable1_false
benchmark: 156,953 ns RxDogTagAndroidPerf.observable1000_true
benchmark: 17,854 ns RxDogTagAndroidPerf.flowable1000_false
benchmark: 26,984,534 ns RxDogTagAndroidPerf.observable1000000_false
benchmark: 148 ns RxDogTagAndroidPerf.observable_false_subscribe_simple
Timed out waiting for process to appear on google-pixel_2-HT79N1A00303.
benchmark: 16,765 ns RxDogTagAndroidPerf.flowable1_true
benchmark: 15,677 ns RxDogTagAndroidPerf.observable1_true_withoutGuardedDelegate
benchmark: 15,895 ns RxDogTagAndroidPerf.flowable_true_subscribe_simple
benchmark: 27,913 ns RxDogTagAndroidPerf.observable1000_false
benchmark: 34,621,670 ns RxDogTagAndroidPerf.observable1000000_true_withoutGuardedDelegate
benchmark: 15,630 ns RxDogTagAndroidPerf.observable_true_subscribe_simple_withoutGuardedDelegate
benchmark: 129,817 ns RxDogTagAndroidPerf.observable_true_e2e
benchmark: 224,655,387 ns RxDogTagAndroidPerf.flowable1000000_true
benchmark: 5,331 ns RxDogTagAndroidPerf.observable_false_subscribe_complex
benchmark: 152,865 ns RxDogTagAndroidPerf.flowable_true_e2e_withoutGuardedDelegate
benchmark: 423 ns RxDogTagAndroidPerf.observable1_false
benchmark: 126,928 ns RxDogTagAndroidPerf.observable_true_e2e_withoutGuardedDelegate
benchmark: 29,531 ns RxDogTagAndroidPerf.flowable_true_subscribe_complex
benchmark: 210,677 ns RxDogTagAndroidPerf.flowable1000_true
benchmark: 29,811,097 ns RxDogTagAndroidPerf.flowable1000000_false
benchmark: 60,498 ns RxDogTagAndroidPerf.flowable_false_subscribe_complex
benchmark: 36,630 ns RxDogTagAndroidPerf.flowable_true_subscribe_complex_withoutGuardedCall
benchmark: 110,730 ns RxDogTagAndroidPerf.flowable_false_e2e
benchmark: 280,736,746 ns RxDogTagAndroidPerf.observable1000000_true
benchmark: 15,881 ns RxDogTagAndroidPerf.flowable_true_subscribe_simple_withoutGuardedDelegate
benchmark: 15,973 ns RxDogTagAndroidPerf.observable_true_subscribe_simple
benchmark: 23,033 ns RxDogTagAndroidPerf.observable_true_subscribe_complex_withoutGuardedDelegate
benchmark: 22,095 ns RxDogTagAndroidPerf.observable_true_subscribe_complex
benchmark: 16,603 ns RxDogTagAndroidPerf.observable1_true
benchmark: 176,510 ns RxDogTagAndroidPerf.flowable_true_e2e
benchmark: 51,765 ns RxDogTagAndroidPerf.flowable1000_true_withoutGuardedDelegate
benchmark: 198 ns RxDogTagAndroidPerf.flowable_false_subscribe_simple
benchmark: 104,063 ns RxDogTagAndroidPerf.observable_false_e2e
benchmark: 36,557,868 ns RxDogTagAndroidPerf.flowable1000000_true_withoutGuardedDelegate
benchmark: 49,496 ns RxDogTagAndroidPerf.observable1000_true_withoutGuardedDelegate
benchmark: 320 ns RxDogTagAndroidPerf.flowable1_false
benchmark: 16,157 ns RxDogTagAndroidPerf.flowable1_true_withoutGuardedDelegate
benchmark: 249,479 ns RxDogTagAndroidPerf.observable1000_true
benchmark: 32,566 ns RxDogTagAndroidPerf.flowable1000_false
""".trimIndent()

// Skip the header line
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,12 @@ final class DogTagCompletableObserver implements CompletableObserver, LambdaCons

@Override
public void onSubscribe(Disposable d) {
guardedDelegateCall(
e -> reportError(config, t, e, "onSubscribe"), () -> delegate.onSubscribe(d));
if (config.guardObserverCallbacks) {
guardedDelegateCall(
e -> reportError(config, t, e, "onSubscribe"), () -> delegate.onSubscribe(d));
} else {
delegate.onSubscribe(d);
}
}

@Override
Expand All @@ -56,7 +60,11 @@ public void onError(Throwable e) {

@Override
public void onComplete() {
guardedDelegateCall(e -> reportError(config, t, e, "onComplete"), delegate::onComplete);
if (config.guardObserverCallbacks) {
guardedDelegateCall(e -> reportError(config, t, e, "onComplete"), delegate::onComplete);
} else {
delegate.onComplete();
}
}

@Override
Expand Down
22 changes: 17 additions & 5 deletions rxdogtag/src/main/java/com/uber/rxdogtag/DogTagMaybeObserver.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,22 @@ final class DogTagMaybeObserver<T> implements MaybeObserver<T>, LambdaConsumerIn

@Override
public void onSubscribe(Disposable d) {
guardedDelegateCall(
e -> reportError(config, t, e, "onSubscribe"), () -> delegate.onSubscribe(d));
if (config.guardObserverCallbacks) {
guardedDelegateCall(
e -> reportError(config, t, e, "onSubscribe"), () -> delegate.onSubscribe(d));
} else {
delegate.onSubscribe(d);
}
}

@Override
public void onSuccess(T t) {
guardedDelegateCall(
e -> reportError(config, this.t, e, "onSuccess"), () -> delegate.onSuccess(t));
if (config.guardObserverCallbacks) {
guardedDelegateCall(
e -> reportError(config, this.t, e, "onSuccess"), () -> delegate.onSuccess(t));
} else {
delegate.onSuccess(t);
}
}

@Override
Expand All @@ -65,7 +73,11 @@ public void onError(Throwable e) {

@Override
public void onComplete() {
guardedDelegateCall(e -> reportError(config, t, e, "onComplete"), delegate::onComplete);
if (config.guardObserverCallbacks) {
guardedDelegateCall(e -> reportError(config, t, e, "onComplete"), delegate::onComplete);
} else {
delegate.onComplete();
}
}

@Override
Expand Down
Loading

0 comments on commit 43c433b

Please sign in to comment.