1+ package com .baeldung .streams .multiplefilters ;
2+
3+ import java .text .MessageFormat ;
4+ import java .util .function .Function ;
5+ import java .util .stream .IntStream ;
6+
7+ import org .apache .commons .lang3 .time .StopWatch ;
8+ import org .junit .Test ;
9+
10+ public class MultipleFiltersVsComplexConditionFilterPerformanceIntegrationTest {
11+
12+ // this test is slow, avoid running it on pipeline
13+ @ Test
14+ public void measureProcessingTimeForEachSolution () {
15+
16+ averageMultipleMeasurements ("Stream with Multiple Filters" , this ::measureTimeForMultipleFilters , 10_000 );
17+ averageMultipleMeasurements ("Stream with Multiple Filters" , this ::measureTimeForMultipleFilters , 100_000 );
18+ averageMultipleMeasurements ("Stream with Multiple Filters" , this ::measureTimeForMultipleFilters , 10_00_000 );
19+ averageMultipleMeasurements ("Stream with Multiple Filters" , this ::measureTimeForMultipleFilters , 1_0000_000 );
20+
21+ averageMultipleMeasurements ("Stream with Complex Condition" , this ::measureTimeForComplexCondition , 10_000 );
22+ averageMultipleMeasurements ("Stream with Complex Condition" , this ::measureTimeForComplexCondition , 100_000 );
23+ averageMultipleMeasurements ("Stream with Complex Condition" , this ::measureTimeForComplexCondition , 10_00_000 );
24+ averageMultipleMeasurements ("Stream with Complex Condition" , this ::measureTimeForComplexCondition , 1_0000_000 );
25+
26+ averageMultipleMeasurements ("Parallel Stream with Multiple Filters" , this ::measureTimeForParallelStreamWithMultipleFilters , 10_000 );
27+ averageMultipleMeasurements ("Parallel Stream with Multiple Filters" , this ::measureTimeForParallelStreamWithMultipleFilters , 100_000 );
28+ averageMultipleMeasurements ("Parallel Stream with Multiple Filters" , this ::measureTimeForParallelStreamWithMultipleFilters , 10_00_000 );
29+ averageMultipleMeasurements ("Parallel Stream with Multiple Filters" , this ::measureTimeForParallelStreamWithMultipleFilters , 1_0000_000 );
30+
31+ averageMultipleMeasurements ("Parallel Stream with Complex Condition" , this ::measureTimeForParallelStreamWithComplexCondition , 10_000 );
32+ averageMultipleMeasurements ("Parallel Stream with Complex Condition" , this ::measureTimeForParallelStreamWithComplexCondition , 100_000 );
33+ averageMultipleMeasurements ("Parallel Stream with Complex Condition" , this ::measureTimeForParallelStreamWithComplexCondition , 10_00_000 );
34+ averageMultipleMeasurements ("Parallel Stream with Complex Condition" , this ::measureTimeForParallelStreamWithComplexCondition , 1_0000_000 );
35+
36+ averageMultipleMeasurements ("Old For Loop with Complex Condition" , this ::measureTimeForOlfForLoopWithComplexCondition , 10_000 );
37+ averageMultipleMeasurements ("Old For Loop with Complex Condition" , this ::measureTimeForOlfForLoopWithComplexCondition , 100_000 );
38+ averageMultipleMeasurements ("Old For Loop with Complex Condition" , this ::measureTimeForOlfForLoopWithComplexCondition , 10_00_000 );
39+ averageMultipleMeasurements ("Old For Loop with Complex Condition" , this ::measureTimeForOlfForLoopWithComplexCondition , 1_0000_000 );
40+
41+ }
42+
43+ private void averageMultipleMeasurements (String measurementName , Function <Integer , Long > measurement , int range ) {
44+ double avgTime = IntStream .range (0 , 100 )
45+ .mapToLong (i -> measurement .apply (range ))
46+ .average ()
47+ .orElseThrow ();
48+
49+ System .out .println (MessageFormat .format ("{0}; Stream size: {1}; Processing Time (ms): {2}" , measurementName , range , avgTime ));
50+ }
51+
52+ public long measureTimeForMultipleFilters (int range ) {
53+ StopWatch watch = new StopWatch ();
54+ watch .start ();
55+
56+ IntStream .range (0 , range )
57+ .boxed ()
58+ .filter (i -> i != 10 )
59+ .filter (i -> i != 20 )
60+ .filter (i -> i != 30 )
61+ .filter (i -> i != 40 )
62+ .filter (i -> i != 50 )
63+ .filter (i -> i != 60 )
64+ .count ();
65+
66+ watch .stop ();
67+ return watch .getTime ();
68+ }
69+
70+ public long measureTimeForParallelStreamWithMultipleFilters (int range ) {
71+ StopWatch watch = new StopWatch ();
72+ watch .start ();
73+
74+ IntStream .range (0 , range )
75+ .boxed ()
76+ .parallel ()
77+ .filter (i -> i != 10 )
78+ .filter (i -> i != 20 )
79+ .filter (i -> i != 30 )
80+ .filter (i -> i != 40 )
81+ .filter (i -> i != 50 )
82+ .filter (i -> i != 60 )
83+ .count ();
84+
85+ watch .stop ();
86+ return watch .getTime ();
87+ }
88+
89+ public long measureTimeForComplexCondition (int range ) {
90+ StopWatch watch = new StopWatch ();
91+ watch .start ();
92+
93+ IntStream .range (0 , range )
94+ .boxed ()
95+ .filter (i -> i != 10 && i != 20 && i != 30 && i != 40 && i != 50 && i != 60 )
96+ .count ();
97+
98+ watch .stop ();
99+ return watch .getTime ();
100+ }
101+
102+ public long measureTimeForParallelStreamWithComplexCondition (int range ) {
103+ StopWatch watch = new StopWatch ();
104+ watch .start ();
105+
106+ IntStream .range (0 , range )
107+ .boxed ()
108+ .parallel ()
109+ .filter (i -> i != 10 && i != 20 && i != 30 && i != 40 && i != 50 && i != 60 )
110+ .count ();
111+
112+ watch .stop ();
113+ return watch .getTime ();
114+ }
115+
116+ public long measureTimeForOlfForLoopWithComplexCondition (int range ) {
117+ StopWatch watch = new StopWatch ();
118+ watch .start ();
119+
120+ int count = 0 ;
121+ for (int i = 0 ; i <= range ; i ++) {
122+ if (i != 10 && i != 20 && i != 30 && i != 40 && i != 50 && i != 60 ) {
123+ count ++;
124+ }
125+ }
126+
127+ watch .stop ();
128+ return watch .getTime ();
129+ }
130+ }
0 commit comments