Skip to content

Commit a539151

Browse files
committed
Merge pull request #3754 from akarnokd/FlatMapAsFilterPerf
1.x: measure flatMap/concatMap performance when used as filter
2 parents 3217017 + fcfa4d4 commit a539151

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/**
2+
* Copyright 2016 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.concurrent.TimeUnit;
20+
21+
import org.openjdk.jmh.annotations.*;
22+
import org.openjdk.jmh.infra.Blackhole;
23+
24+
import rx.Observable;
25+
import rx.functions.Func1;
26+
import rx.jmh.LatchedObserver;
27+
28+
/**
29+
* Benchmark flatMap running over a mixture of normal and empty Observables.
30+
* <p>
31+
* gradlew benchmarks "-Pjmh=-f 1 -tu s -bm thrpt -wi 5 -i 5 -r 1 .*FlatMapAsFilterPerf.*"
32+
* <p>
33+
* gradlew benchmarks "-Pjmh=-f 1 -tu ns -bm avgt -wi 5 -i 5 -r 1 .*FlatMapAsFilterPerf.*"
34+
*/
35+
@BenchmarkMode(Mode.Throughput)
36+
@OutputTimeUnit(TimeUnit.SECONDS)
37+
@State(Scope.Thread)
38+
public class FlatMapAsFilterPerf {
39+
40+
@Param({"1", "1000", "1000000"})
41+
public int count;
42+
43+
@Param({"0", "1", "3", "7"})
44+
public int mask;
45+
46+
public Observable<Integer> justEmptyFlatMap;
47+
48+
public Observable<Integer> rangeEmptyFlatMap;
49+
50+
public Observable<Integer> justEmptyConcatMap;
51+
52+
public Observable<Integer> rangeEmptyConcatMap;
53+
54+
@Setup
55+
public void setup() {
56+
if (count == 1 && mask != 0) {
57+
throw new RuntimeException("Force skip");
58+
}
59+
Integer[] values = new Integer[count];
60+
for (int i = 0; i < count; i++) {
61+
values[i] = i;
62+
}
63+
final Observable<Integer> just = Observable.just(1);
64+
65+
final Observable<Integer> range = Observable.range(1, 2);
66+
67+
final Observable<Integer> empty = Observable.empty();
68+
69+
final int m = mask;
70+
71+
justEmptyFlatMap = Observable.from(values).flatMap(new Func1<Integer, Observable<Integer>>() {
72+
@Override
73+
public Observable<Integer> call(Integer v) {
74+
return (v & m) == 0 ? empty : just;
75+
}
76+
});
77+
78+
rangeEmptyFlatMap = Observable.from(values).flatMap(new Func1<Integer, Observable<Integer>>() {
79+
@Override
80+
public Observable<Integer> call(Integer v) {
81+
return (v & m) == 0 ? empty : range;
82+
}
83+
});
84+
85+
justEmptyConcatMap = Observable.from(values).concatMap(new Func1<Integer, Observable<Integer>>() {
86+
@Override
87+
public Observable<Integer> call(Integer v) {
88+
return (v & m) == 0 ? empty : just;
89+
}
90+
});
91+
92+
rangeEmptyConcatMap = Observable.from(values).concatMap(new Func1<Integer, Observable<Integer>>() {
93+
@Override
94+
public Observable<Integer> call(Integer v) {
95+
return (v & m) == 0 ? empty : range;
96+
}
97+
});
98+
}
99+
100+
@Benchmark
101+
public void justEmptyFlatMap(Blackhole bh) {
102+
justEmptyFlatMap.subscribe(new LatchedObserver<Integer>(bh));
103+
}
104+
105+
@Benchmark
106+
public void rangeEmptyFlatMap(Blackhole bh) {
107+
rangeEmptyFlatMap.subscribe(new LatchedObserver<Integer>(bh));
108+
}
109+
110+
@Benchmark
111+
public void justEmptyConcatMap(Blackhole bh) {
112+
justEmptyConcatMap.subscribe(new LatchedObserver<Integer>(bh));
113+
}
114+
115+
@Benchmark
116+
public void rangeEmptyConcatMap(Blackhole bh) {
117+
rangeEmptyConcatMap.subscribe(new LatchedObserver<Integer>(bh));
118+
}
119+
}

0 commit comments

Comments
 (0)