Skip to content

Commit 54c6ed2

Browse files
committed
1.x: ConcatMap vs ConcatMapIterable perf (#3853)
1 parent d799eca commit 54c6ed2

File tree

1 file changed

+181
-0
lines changed

1 file changed

+181
-0
lines changed
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
/**
2+
* Copyright 2014 Netflix, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package rx.operators;
18+
19+
import java.util.*;
20+
import java.util.concurrent.TimeUnit;
21+
22+
import org.openjdk.jmh.annotations.Benchmark;
23+
import org.openjdk.jmh.annotations.BenchmarkMode;
24+
import org.openjdk.jmh.annotations.Mode;
25+
import org.openjdk.jmh.annotations.OutputTimeUnit;
26+
import org.openjdk.jmh.annotations.Param;
27+
import org.openjdk.jmh.annotations.Scope;
28+
import org.openjdk.jmh.annotations.Setup;
29+
import org.openjdk.jmh.annotations.State;
30+
import org.openjdk.jmh.infra.Blackhole;
31+
32+
import rx.Observable;
33+
import rx.functions.Func1;
34+
import rx.jmh.LatchedObserver;
35+
36+
/**
37+
* Benchmark ConcatMapIterable.
38+
* <p>
39+
* gradlew benchmarks "-Pjmh=-f 1 -tu s -bm thrpt -wi 5 -i 5 -r 1 .*ConcatMapInterablePerf.*"
40+
* <p>
41+
* gradlew benchmarks "-Pjmh=-f 1 -tu ns -bm avgt -wi 5 -i 5 -r 1 .*ConcatMapInterablePerf.*"
42+
*/
43+
@BenchmarkMode(Mode.Throughput)
44+
@OutputTimeUnit(TimeUnit.SECONDS)
45+
@State(Scope.Thread)
46+
public class ConcatMapInterablePerf {
47+
48+
@Param({"1", "10", "100", "1000", "10000", "100000", "1000000"})
49+
public int count;
50+
51+
Observable<Integer> justPlain;
52+
53+
Observable<Integer> justIterable;
54+
55+
Observable<Integer> rangePlain;
56+
57+
Observable<Integer> rangeIterable;
58+
59+
Observable<Integer> xrangePlain;
60+
61+
Observable<Integer> xrangeIterable;
62+
63+
Observable<Integer> chainPlain;
64+
65+
Observable<Integer> chainIterable;
66+
67+
@Setup
68+
public void setup() {
69+
Integer[] values = new Integer[count];
70+
for (int i = 0; i < count; i++) {
71+
values[i] = i;
72+
}
73+
74+
int c = 1000000 / count;
75+
Integer[] xvalues = new Integer[c];
76+
for (int i = 0; i < c; i++) {
77+
xvalues[i] = i;
78+
}
79+
80+
Observable<Integer> source = Observable.from(values);
81+
82+
justPlain = source.concatMap(new Func1<Integer, Observable<Integer>>() {
83+
@Override
84+
public Observable<Integer> call(Integer v) {
85+
return Observable.just(v);
86+
}
87+
});
88+
justIterable = source.concatMapIterable(new Func1<Integer, Iterable<Integer>>() {
89+
@Override
90+
public Iterable<Integer> call(Integer v) {
91+
return Collections.singleton(v);
92+
}
93+
});
94+
95+
final Observable<Integer> range = Observable.range(1, 2);
96+
final List<Integer> xrange = Arrays.asList(1, 2);
97+
98+
rangePlain = source.concatMap(new Func1<Integer, Observable<Integer>>() {
99+
@Override
100+
public Observable<Integer> call(Integer v) {
101+
return range;
102+
}
103+
});
104+
rangeIterable = source.concatMapIterable(new Func1<Integer, Iterable<Integer>>() {
105+
@Override
106+
public Iterable<Integer> call(Integer v) {
107+
return xrange;
108+
}
109+
});
110+
111+
final Observable<Integer> xsource = Observable.from(xvalues);
112+
final List<Integer> xvaluesList = Arrays.asList(xvalues);
113+
114+
xrangePlain = source.concatMap(new Func1<Integer, Observable<Integer>>() {
115+
@Override
116+
public Observable<Integer> call(Integer v) {
117+
return xsource;
118+
}
119+
});
120+
xrangeIterable = source.concatMapIterable(new Func1<Integer, Iterable<Integer>>() {
121+
@Override
122+
public Iterable<Integer> call(Integer v) {
123+
return xvaluesList;
124+
}
125+
});
126+
127+
chainPlain = xrangePlain.concatMap(new Func1<Integer, Observable<Integer>>() {
128+
@Override
129+
public Observable<Integer> call(Integer v) {
130+
return Observable.just(v);
131+
}
132+
});
133+
chainIterable = xrangeIterable.concatMapIterable(new Func1<Integer, Iterable<Integer>>() {
134+
@Override
135+
public Iterable<Integer> call(Integer v) {
136+
return Collections.singleton(v);
137+
}
138+
});
139+
}
140+
141+
@Benchmark
142+
public void justPlain(Blackhole bh) {
143+
justPlain.subscribe(new LatchedObserver<Integer>(bh));
144+
}
145+
146+
@Benchmark
147+
public void justIterable(Blackhole bh) {
148+
justIterable.subscribe(new LatchedObserver<Integer>(bh));
149+
}
150+
151+
@Benchmark
152+
public void rangePlain(Blackhole bh) {
153+
rangePlain.subscribe(new LatchedObserver<Integer>(bh));
154+
}
155+
156+
@Benchmark
157+
public void rangeIterable(Blackhole bh) {
158+
rangeIterable.subscribe(new LatchedObserver<Integer>(bh));
159+
}
160+
161+
@Benchmark
162+
public void xrangePlain(Blackhole bh) {
163+
xrangePlain.subscribe(new LatchedObserver<Integer>(bh));
164+
}
165+
166+
@Benchmark
167+
public void xrangeIterable(Blackhole bh) {
168+
xrangeIterable.subscribe(new LatchedObserver<Integer>(bh));
169+
}
170+
171+
@Benchmark
172+
public void chainPlain(Blackhole bh) {
173+
chainPlain.subscribe(new LatchedObserver<Integer>(bh));
174+
}
175+
176+
@Benchmark
177+
public void chainIterable(Blackhole bh) {
178+
chainIterable.subscribe(new LatchedObserver<Integer>(bh));
179+
}
180+
181+
}

0 commit comments

Comments
 (0)