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