Skip to content

Commit 897eecb

Browse files
committed
Josh Cummings suggestions: Package renamed and Benchmark using JMH
1 parent e8b17fe commit 897eecb

File tree

4 files changed

+65
-32
lines changed

4 files changed

+65
-32
lines changed

core-java-modules/core-java-11/src/test/java/com/baeldung/pattern/PatternJava11UnitTest.java renamed to core-java-modules/core-java-11/src/test/java/com/baeldung/patternreuse/PatternJava11UnitTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.baeldung.pattern;
1+
package com.baeldung.patternreuse;
22

33
import org.junit.jupiter.api.Test;
44

core-java-modules/core-java-text/pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,19 @@
1313
<relativePath>../../parent-java</relativePath>
1414
</parent>
1515

16+
<dependencies>
17+
<dependency>
18+
<groupId>org.openjdk.jmh</groupId>
19+
<artifactId>jmh-core</artifactId>
20+
<version>${jmh-core.version}</version>
21+
</dependency>
22+
<dependency>
23+
<groupId>org.openjdk.jmh</groupId>
24+
<artifactId>jmh-generator-annprocess</artifactId>
25+
<version>${jmh-core.version}</version>
26+
</dependency>
27+
</dependencies>
28+
1629
<build>
1730
<finalName>core-java-text</finalName>
1831
<resources>

core-java-modules/core-java-text/src/main/java/com/baeldung/pattern/PatternPerformanceComparison.java renamed to core-java-modules/core-java-text/src/main/java/com/baeldung/patternreuse/PatternPerformanceComparison.java

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,88 @@
1-
package com.baeldung.pattern;
1+
package com.baeldung.patternreuse;
22

3-
import java.time.Duration;
3+
import org.openjdk.jmh.annotations.*;
4+
import org.openjdk.jmh.runner.RunnerException;
5+
6+
import java.io.IOException;
47
import java.time.Instant;
58
import java.util.ArrayList;
69
import java.util.List;
10+
import java.util.concurrent.TimeUnit;
711
import java.util.regex.Matcher;
812
import java.util.regex.Pattern;
913

14+
@BenchmarkMode(Mode.AverageTime)
15+
@OutputTimeUnit(TimeUnit.MILLISECONDS)
16+
@Fork(value = 1, warmups = 1)
17+
@Warmup(iterations = 5)
18+
@State(Scope.Benchmark)
1019
public class PatternPerformanceComparison {
1120

1221
private static final String PATTERN = "\\d*[02468]";
1322
private static List<String> values;
1423

15-
public static void main(String[] args) {
16-
loadValues();
24+
private static Matcher matcherFromPreCompiledPattern;
25+
private static Pattern preCompiledPattern;
1726

18-
// 5_000_000 Pattern objects created
19-
// 5_000_000 Matcher objects created
20-
Instant start = Instant.now();
27+
public static void main(String[] args) throws IOException, RunnerException {
28+
org.openjdk.jmh.Main.main(args);
29+
}
30+
31+
@Benchmark
32+
public void matcherFromPreCompiledPatternResetMatches() {
33+
//With pre-compiled pattern and reusing the matcher
34+
// 1 Pattern object created
35+
// 1 Matcher objects created
2136
for (String value : values) {
22-
value.matches(PATTERN);
37+
matcherFromPreCompiledPattern.reset(value).matches();
2338
}
24-
System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> String.matchs(regex)");
39+
}
2540

26-
// Above approach "value.matches(PATTERN)" makes this internally
27-
// 5_000_000 Pattern objects created
41+
@Benchmark
42+
public void preCompiledPatternMatcherMatches() {
43+
// With pre-compiled pattern
44+
// 1 Pattern object created
2845
// 5_000_000 Matcher objects created
29-
start = Instant.now();
3046
for (String value : values) {
31-
Pattern.matches(PATTERN, value);
47+
preCompiledPattern.matcher(value).matches();
3248
}
33-
System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> Pattern.matches(regex, charSequence)");
49+
}
3450

51+
@Benchmark
52+
public void patternCompileMatcherMatches() {
3553
// Above approach "Pattern.matches(PATTERN, value)" makes this internally
3654
// 5_000_000 Pattern objects created
3755
// 5_000_000 Matcher objects created
38-
start = Instant.now();
3956
for (String value : values) {
4057
Pattern.compile(PATTERN).matcher(value).matches();
4158
}
42-
System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> Pattern.compile(regex).matcher(charSequence).matches()");
59+
}
4360

44-
// With pre-compiled pattern
45-
// 1 Pattern object created
61+
@Benchmark
62+
public void patternMatches() {
63+
// Above approach "value.matches(PATTERN)" makes this internally
64+
// 5_000_000 Pattern objects created
4665
// 5_000_000 Matcher objects created
47-
Pattern preCompiledPattern = Pattern.compile(PATTERN);
48-
start = Instant.now();
4966
for (String value : values) {
50-
preCompiledPattern.matcher(value).matches();
67+
Pattern.matches(PATTERN, value);
5168
}
52-
System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> preCompiledPattern.matcher(value).matches()");
69+
}
5370

54-
//With pre-compiled pattern and reusing the matcher
55-
// 1 Pattern object created
56-
// 1 Matcher objects created
57-
Matcher matcherFromPreCompiledPattern = preCompiledPattern.matcher("");
58-
start = Instant.now();
71+
@Benchmark
72+
public void stringMatchs() {
73+
// 5_000_000 Pattern objects created
74+
// 5_000_000 Matcher objects created
75+
Instant start = Instant.now();
5976
for (String value : values) {
60-
matcherFromPreCompiledPattern.reset(value).matches();
77+
value.matches(PATTERN);
6178
}
62-
System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> matcherFromPreCompiledPattern.reset(value).matches()");
6379
}
6480

65-
private static void loadValues() {
81+
@Setup()
82+
public void setUp() {
83+
preCompiledPattern = Pattern.compile(PATTERN);
84+
matcherFromPreCompiledPattern = preCompiledPattern.matcher("");
85+
6686
values = new ArrayList<>();
6787
for (int x = 1; x <= 5_000_000; x++) {
6888
values.add(String.valueOf(x));

core-java-modules/core-java-text/src/test/java/com/baeldung/pattern/PatternUnitTest.java renamed to core-java-modules/core-java-text/src/test/java/com/baeldung/patternreuse/PatternUnitTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.baeldung.pattern;
1+
package com.baeldung.patternreuse;
22

33
import org.junit.jupiter.api.Test;
44

0 commit comments

Comments
 (0)