Skip to content

Commit b9f5ef8

Browse files
authored
2.x: benchmark (0..1).flatMap and flattenAs performance (#6017)
1 parent 9ff403e commit b9f5ef8

File tree

1 file changed

+275
-0
lines changed

1 file changed

+275
-0
lines changed
Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,275 @@
1+
/**
2+
* Copyright (c) 2016-present, RxJava Contributors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
5+
* compliance with the License. You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software distributed under the License is
10+
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See
11+
* the License for the specific language governing permissions and limitations under the License.
12+
*/
13+
14+
package io.reactivex;
15+
16+
import java.util.*;
17+
import java.util.concurrent.TimeUnit;
18+
19+
import org.openjdk.jmh.annotations.*;
20+
import org.openjdk.jmh.infra.Blackhole;
21+
import org.reactivestreams.Publisher;
22+
23+
import io.reactivex.Observable;
24+
import io.reactivex.functions.Function;
25+
26+
@BenchmarkMode(Mode.Throughput)
27+
@Warmup(iterations = 5)
28+
@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)
29+
@OutputTimeUnit(TimeUnit.SECONDS)
30+
@Fork(value = 1)
31+
@State(Scope.Thread)
32+
public class BinaryFlatMapPerf {
33+
@Param({ "1", "1000", "1000000" })
34+
public int times;
35+
36+
Flowable<Integer> singleFlatMapPublisher;
37+
38+
Flowable<Integer> singleFlatMapHidePublisher;
39+
40+
Flowable<Integer> singleFlattenAsPublisher;
41+
42+
Flowable<Integer> maybeFlatMapPublisher;
43+
44+
Flowable<Integer> maybeFlatMapHidePublisher;
45+
46+
Flowable<Integer> maybeFlattenAsPublisher;
47+
48+
Flowable<Integer> completableFlatMapPublisher;
49+
50+
Flowable<Integer> completableFlattenAsPublisher;
51+
52+
Observable<Integer> singleFlatMapObservable;
53+
54+
Observable<Integer> singleFlatMapHideObservable;
55+
56+
Observable<Integer> singleFlattenAsObservable;
57+
58+
Observable<Integer> maybeFlatMapObservable;
59+
60+
Observable<Integer> maybeFlatMapHideObservable;
61+
62+
Observable<Integer> maybeFlattenAsObservable;
63+
64+
Observable<Integer> completableFlatMapObservable;
65+
66+
Observable<Integer> completableFlattenAsObservable;
67+
68+
@Setup
69+
public void setup() {
70+
71+
// --------------------------------------------------------------------------
72+
73+
final Integer[] array = new Integer[times];
74+
Arrays.fill(array, 777);
75+
76+
final List<Integer> list = Arrays.asList(array);
77+
78+
final Flowable<Integer> arrayFlowable = Flowable.fromArray(array);
79+
final Flowable<Integer> arrayFlowableHide = Flowable.fromArray(array).hide();
80+
final Flowable<Integer> listFlowable = Flowable.fromIterable(list);
81+
82+
final Observable<Integer> arrayObservable = Observable.fromArray(array);
83+
final Observable<Integer> arrayObservableHide = Observable.fromArray(array).hide();
84+
final Observable<Integer> listObservable = Observable.fromIterable(list);
85+
86+
// --------------------------------------------------------------------------
87+
88+
singleFlatMapPublisher = Single.just(1).flatMapPublisher(new Function<Integer, Publisher<? extends Integer>>() {
89+
@Override
90+
public Publisher<? extends Integer> apply(Integer v)
91+
throws Exception {
92+
return arrayFlowable;
93+
}
94+
});
95+
96+
singleFlatMapHidePublisher = Single.just(1).flatMapPublisher(new Function<Integer, Publisher<? extends Integer>>() {
97+
@Override
98+
public Publisher<? extends Integer> apply(Integer v)
99+
throws Exception {
100+
return arrayFlowableHide;
101+
}
102+
});
103+
104+
singleFlattenAsPublisher = Single.just(1).flattenAsFlowable(new Function<Integer, Iterable<? extends Integer>>() {
105+
@Override
106+
public Iterable<? extends Integer> apply(Integer v)
107+
throws Exception {
108+
return list;
109+
}
110+
});
111+
112+
maybeFlatMapPublisher = Maybe.just(1).flatMapPublisher(new Function<Integer, Publisher<? extends Integer>>() {
113+
@Override
114+
public Publisher<? extends Integer> apply(Integer v)
115+
throws Exception {
116+
return arrayFlowable;
117+
}
118+
});
119+
120+
maybeFlatMapHidePublisher = Maybe.just(1).flatMapPublisher(new Function<Integer, Publisher<? extends Integer>>() {
121+
@Override
122+
public Publisher<? extends Integer> apply(Integer v)
123+
throws Exception {
124+
return arrayFlowableHide;
125+
}
126+
});
127+
128+
maybeFlattenAsPublisher = Maybe.just(1).flattenAsFlowable(new Function<Integer, Iterable<? extends Integer>>() {
129+
@Override
130+
public Iterable<? extends Integer> apply(Integer v)
131+
throws Exception {
132+
return list;
133+
}
134+
});
135+
136+
completableFlatMapPublisher = Completable.complete().andThen(listFlowable);
137+
138+
completableFlattenAsPublisher = Completable.complete().andThen(arrayFlowable);
139+
140+
// --------------------------------------------------------------------------
141+
142+
singleFlatMapObservable = Single.just(1).flatMapObservable(new Function<Integer, Observable<? extends Integer>>() {
143+
@Override
144+
public Observable<? extends Integer> apply(Integer v)
145+
throws Exception {
146+
return arrayObservable;
147+
}
148+
});
149+
150+
singleFlatMapHideObservable = Single.just(1).flatMapObservable(new Function<Integer, Observable<? extends Integer>>() {
151+
@Override
152+
public Observable<? extends Integer> apply(Integer v)
153+
throws Exception {
154+
return arrayObservableHide;
155+
}
156+
});
157+
158+
singleFlattenAsObservable = Single.just(1).flattenAsObservable(new Function<Integer, Iterable<? extends Integer>>() {
159+
@Override
160+
public Iterable<? extends Integer> apply(Integer v)
161+
throws Exception {
162+
return list;
163+
}
164+
});
165+
166+
maybeFlatMapObservable = Maybe.just(1).flatMapObservable(new Function<Integer, Observable<? extends Integer>>() {
167+
@Override
168+
public Observable<? extends Integer> apply(Integer v)
169+
throws Exception {
170+
return arrayObservable;
171+
}
172+
});
173+
174+
maybeFlatMapHideObservable = Maybe.just(1).flatMapObservable(new Function<Integer, Observable<? extends Integer>>() {
175+
@Override
176+
public Observable<? extends Integer> apply(Integer v)
177+
throws Exception {
178+
return arrayObservableHide;
179+
}
180+
});
181+
182+
maybeFlattenAsObservable = Maybe.just(1).flattenAsObservable(new Function<Integer, Iterable<? extends Integer>>() {
183+
@Override
184+
public Iterable<? extends Integer> apply(Integer v)
185+
throws Exception {
186+
return list;
187+
}
188+
});
189+
190+
completableFlatMapObservable = Completable.complete().andThen(listObservable);
191+
192+
completableFlattenAsObservable = Completable.complete().andThen(arrayObservable);
193+
194+
}
195+
196+
@Benchmark
197+
public void singleFlatMapPublisher(Blackhole bh) {
198+
singleFlatMapPublisher.subscribe(new PerfConsumer(bh));
199+
}
200+
201+
@Benchmark
202+
public void singleFlatMapHidePublisher(Blackhole bh) {
203+
singleFlatMapHidePublisher.subscribe(new PerfConsumer(bh));
204+
}
205+
206+
@Benchmark
207+
public void singleFlattenAsPublisher(Blackhole bh) {
208+
singleFlattenAsPublisher.subscribe(new PerfConsumer(bh));
209+
}
210+
211+
@Benchmark
212+
public void maybeFlatMapPublisher(Blackhole bh) {
213+
maybeFlatMapPublisher.subscribe(new PerfConsumer(bh));
214+
}
215+
216+
@Benchmark
217+
public void maybeFlatMapHidePublisher(Blackhole bh) {
218+
maybeFlatMapHidePublisher.subscribe(new PerfConsumer(bh));
219+
}
220+
221+
@Benchmark
222+
public void maybeFlattenAsPublisher(Blackhole bh) {
223+
maybeFlattenAsPublisher.subscribe(new PerfConsumer(bh));
224+
}
225+
226+
@Benchmark
227+
public void completableFlatMapPublisher(Blackhole bh) {
228+
completableFlatMapPublisher.subscribe(new PerfConsumer(bh));
229+
}
230+
231+
@Benchmark
232+
public void completableFlattenAsPublisher(Blackhole bh) {
233+
completableFlattenAsPublisher.subscribe(new PerfConsumer(bh));
234+
}
235+
236+
@Benchmark
237+
public void singleFlatMapObservable(Blackhole bh) {
238+
singleFlatMapObservable.subscribe(new PerfConsumer(bh));
239+
}
240+
241+
@Benchmark
242+
public void singleFlatMapHideObservable(Blackhole bh) {
243+
singleFlatMapHideObservable.subscribe(new PerfConsumer(bh));
244+
}
245+
246+
@Benchmark
247+
public void singleFlattenAsObservable(Blackhole bh) {
248+
singleFlattenAsObservable.subscribe(new PerfConsumer(bh));
249+
}
250+
251+
@Benchmark
252+
public void maybeFlatMapObservable(Blackhole bh) {
253+
maybeFlatMapObservable.subscribe(new PerfConsumer(bh));
254+
}
255+
256+
@Benchmark
257+
public void maybeFlatMapHideObservable(Blackhole bh) {
258+
maybeFlatMapHideObservable.subscribe(new PerfConsumer(bh));
259+
}
260+
261+
@Benchmark
262+
public void maybeFlattenAsObservable(Blackhole bh) {
263+
maybeFlattenAsObservable.subscribe(new PerfConsumer(bh));
264+
}
265+
266+
@Benchmark
267+
public void completableFlatMapObservable(Blackhole bh) {
268+
completableFlatMapObservable.subscribe(new PerfConsumer(bh));
269+
}
270+
271+
@Benchmark
272+
public void completableFlattenAsObservable(Blackhole bh) {
273+
completableFlattenAsObservable.subscribe(new PerfConsumer(bh));
274+
}
275+
}

0 commit comments

Comments
 (0)