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