diff --git a/core-java-modules/core-java-11/src/test/java/com/baeldung/pattern/PatternJava11UnitTest.java b/core-java-modules/core-java-11/src/test/java/com/baeldung/patternreuse/PatternJava11UnitTest.java
similarity index 96%
rename from core-java-modules/core-java-11/src/test/java/com/baeldung/pattern/PatternJava11UnitTest.java
rename to core-java-modules/core-java-11/src/test/java/com/baeldung/patternreuse/PatternJava11UnitTest.java
index 029755820f..94c8a39c95 100644
--- a/core-java-modules/core-java-11/src/test/java/com/baeldung/pattern/PatternJava11UnitTest.java
+++ b/core-java-modules/core-java-11/src/test/java/com/baeldung/patternreuse/PatternJava11UnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.pattern;
+package com.baeldung.patternreuse;
import org.junit.jupiter.api.Test;
diff --git a/core-java-modules/core-java-text/pom.xml b/core-java-modules/core-java-text/pom.xml
index 43b0df6309..f26dddfae4 100644
--- a/core-java-modules/core-java-text/pom.xml
+++ b/core-java-modules/core-java-text/pom.xml
@@ -13,6 +13,19 @@
../../parent-java
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-core.version}
+
+
+
core-java-text
diff --git a/core-java-modules/core-java-text/src/main/java/com/baeldung/pattern/PatternPerformanceComparison.java b/core-java-modules/core-java-text/src/main/java/com/baeldung/patternreuse/PatternPerformanceComparison.java
similarity index 60%
rename from core-java-modules/core-java-text/src/main/java/com/baeldung/pattern/PatternPerformanceComparison.java
rename to core-java-modules/core-java-text/src/main/java/com/baeldung/patternreuse/PatternPerformanceComparison.java
index 711ae3fa85..01a6121ad0 100644
--- a/core-java-modules/core-java-text/src/main/java/com/baeldung/pattern/PatternPerformanceComparison.java
+++ b/core-java-modules/core-java-text/src/main/java/com/baeldung/patternreuse/PatternPerformanceComparison.java
@@ -1,68 +1,88 @@
-package com.baeldung.pattern;
+package com.baeldung.patternreuse;
-import java.time.Duration;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.runner.RunnerException;
+
+import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@Fork(value = 1, warmups = 1)
+@Warmup(iterations = 5)
+@State(Scope.Benchmark)
public class PatternPerformanceComparison {
private static final String PATTERN = "\\d*[02468]";
private static List values;
- public static void main(String[] args) {
- loadValues();
+ private static Matcher matcherFromPreCompiledPattern;
+ private static Pattern preCompiledPattern;
+ public static void main(String[] args) throws IOException, RunnerException {
+ org.openjdk.jmh.Main.main(args);
+ }
+
+ @Benchmark
+ public void matcherFromPreCompiledPatternResetMatches() {
+ //With pre-compiled pattern and reusing the matcher
+ // 1 Pattern object created
+ // 1 Matcher objects created
+ for (String value : values) {
+ matcherFromPreCompiledPattern.reset(value).matches();
+ }
+ }
+
+ @Benchmark
+ public void preCompiledPatternMatcherMatches() {
+ // With pre-compiled pattern
+ // 1 Pattern object created
+ // 5_000_000 Matcher objects created
+ for (String value : values) {
+ preCompiledPattern.matcher(value).matches();
+ }
+ }
+
+ @Benchmark
+ public void patternCompileMatcherMatches() {
+ // Above approach "Pattern.matches(PATTERN, value)" makes this internally
+ // 5_000_000 Pattern objects created
+ // 5_000_000 Matcher objects created
+ for (String value : values) {
+ Pattern.compile(PATTERN).matcher(value).matches();
+ }
+ }
+
+ @Benchmark
+ public void patternMatches() {
+ // Above approach "value.matches(PATTERN)" makes this internally
+ // 5_000_000 Pattern objects created
+ // 5_000_000 Matcher objects created
+ for (String value : values) {
+ Pattern.matches(PATTERN, value);
+ }
+ }
+
+ @Benchmark
+ public void stringMatchs() {
// 5_000_000 Pattern objects created
// 5_000_000 Matcher objects created
Instant start = Instant.now();
for (String value : values) {
value.matches(PATTERN);
}
- System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> String.matchs(regex)");
-
- // Above approach "value.matches(PATTERN)" makes this internally
- // 5_000_000 Pattern objects created
- // 5_000_000 Matcher objects created
- start = Instant.now();
- for (String value : values) {
- Pattern.matches(PATTERN, value);
- }
- System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> Pattern.matches(regex, charSequence)");
-
- // Above approach "Pattern.matches(PATTERN, value)" makes this internally
- // 5_000_000 Pattern objects created
- // 5_000_000 Matcher objects created
- start = Instant.now();
- for (String value : values) {
- Pattern.compile(PATTERN).matcher(value).matches();
- }
- System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> Pattern.compile(regex).matcher(charSequence).matches()");
-
- // With pre-compiled pattern
- // 1 Pattern object created
- // 5_000_000 Matcher objects created
- Pattern preCompiledPattern = Pattern.compile(PATTERN);
- start = Instant.now();
- for (String value : values) {
- preCompiledPattern.matcher(value).matches();
- }
- System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> preCompiledPattern.matcher(value).matches()");
-
- //With pre-compiled pattern and reusing the matcher
- // 1 Pattern object created
- // 1 Matcher objects created
- Matcher matcherFromPreCompiledPattern = preCompiledPattern.matcher("");
- start = Instant.now();
- for (String value : values) {
- matcherFromPreCompiledPattern.reset(value).matches();
- }
- System.out.println(Duration.between(start, Instant.now()).toMillis() + "ms -> matcherFromPreCompiledPattern.reset(value).matches()");
}
- private static void loadValues() {
+ @Setup()
+ public void setUp() {
+ preCompiledPattern = Pattern.compile(PATTERN);
+ matcherFromPreCompiledPattern = preCompiledPattern.matcher("");
+
values = new ArrayList<>();
for (int x = 1; x <= 5_000_000; x++) {
values.add(String.valueOf(x));
diff --git a/core-java-modules/core-java-text/src/test/java/com/baeldung/pattern/PatternUnitTest.java b/core-java-modules/core-java-text/src/test/java/com/baeldung/patternreuse/PatternUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-text/src/test/java/com/baeldung/pattern/PatternUnitTest.java
rename to core-java-modules/core-java-text/src/test/java/com/baeldung/patternreuse/PatternUnitTest.java
index 20c98480db..70f5c59a95 100644
--- a/core-java-modules/core-java-text/src/test/java/com/baeldung/pattern/PatternUnitTest.java
+++ b/core-java-modules/core-java-text/src/test/java/com/baeldung/patternreuse/PatternUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.pattern;
+package com.baeldung.patternreuse;
import org.junit.jupiter.api.Test;