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;