From 21e5531eeab130f8841ef0b79e521a220cf02bce Mon Sep 17 00:00:00 2001 From: Kyle Simpson Date: Wed, 15 Dec 2021 10:19:57 -0600 Subject: [PATCH 1/3] fixing performance bug (see #64) in Java implementation --- src/main/java/io/github/getify/minify/Minify.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/getify/minify/Minify.java b/src/main/java/io/github/getify/minify/Minify.java index a313c4e..c74e55c 100644 --- a/src/main/java/io/github/getify/minify/Minify.java +++ b/src/main/java/io/github/getify/minify/Minify.java @@ -38,6 +38,7 @@ public static String minify(CharSequence json) { String tmp2; StringBuilder new_str = new StringBuilder(); Integer from = 0; + Integer prevFrom; String lc; String rc = ""; @@ -63,11 +64,12 @@ public static String minify(CharSequence json) { new_str.append(tmp2); } + prevFrom = from; from = matcher.end(); if (tmp.charAt(0) == '\"' && !in_multiline_comment && !in_singleline_comment) { magicMatcher = MAGIC_PATTERN.matcher(lc); - foundMagic = magicMatcher.find(); + foundMagic = magicMatcher.find(prevFrom); if (!in_string || !foundMagic || (magicMatcher.end() - magicMatcher.start()) % 2 == 0) { in_string = !in_string; } From 7fb156e6ec7874cf69a3ace4ff12fdc72ffe7c81 Mon Sep 17 00:00:00 2001 From: Kyle Simpson Date: Wed, 15 Dec 2021 11:05:17 -0600 Subject: [PATCH 2/3] tweaking to just copy less string, which should give better perf --- src/main/java/io/github/getify/minify/Minify.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/getify/minify/Minify.java b/src/main/java/io/github/getify/minify/Minify.java index c74e55c..1965b82 100644 --- a/src/main/java/io/github/getify/minify/Minify.java +++ b/src/main/java/io/github/getify/minify/Minify.java @@ -53,7 +53,8 @@ public static String minify(CharSequence json) { matcher.reset(); while (matcher.find()) { - lc = jsonString.substring(0, matcher.start()); + prevFrom = from; + lc = jsonString.substring(prevFrom, matcher.start()); rc = jsonString.substring(matcher.end(), jsonString.length()); tmp = jsonString.substring(matcher.start(), matcher.end()); @@ -64,12 +65,11 @@ public static String minify(CharSequence json) { new_str.append(tmp2); } - prevFrom = from; from = matcher.end(); if (tmp.charAt(0) == '\"' && !in_multiline_comment && !in_singleline_comment) { magicMatcher = MAGIC_PATTERN.matcher(lc); - foundMagic = magicMatcher.find(prevFrom); + foundMagic = magicMatcher.find(); if (!in_string || !foundMagic || (magicMatcher.end() - magicMatcher.start()) % 2 == 0) { in_string = !in_string; } From 67b106dad69ef2de2f1d3d2748df11a00b10c102 Mon Sep 17 00:00:00 2001 From: Kyle Simpson Date: Tue, 21 Dec 2021 17:54:58 -0800 Subject: [PATCH 3/3] per #64, more performance tweaks --- src/main/java/io/github/getify/minify/Minify.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/getify/minify/Minify.java b/src/main/java/io/github/getify/minify/Minify.java index 1965b82..008336b 100644 --- a/src/main/java/io/github/getify/minify/Minify.java +++ b/src/main/java/io/github/getify/minify/Minify.java @@ -16,9 +16,9 @@ public abstract class Minify { private static final String TOKENIZER = "\"|(/\\*)|(\\*/)|(//)|\\n|\\r"; - private static final String MAGIC = "(\\\\)*$"; + private static final String LOOKBEHIND = "(\\\\)+$"; private static final Pattern PATTERN = Pattern.compile(TOKENIZER); - private static final Pattern MAGIC_PATTERN = Pattern.compile(MAGIC); + private static final Pattern LOOKBEHIND_PATTERN = Pattern.compile(LOOKBEHIND); /** * @@ -61,14 +61,14 @@ public static String minify(CharSequence json) { if (!in_multiline_comment && !in_singleline_comment) { tmp2 = lc.substring(from); if (!in_string) - tmp2 = tmp2.replaceAll("(\\n|\\r|\\s)*", ""); + tmp2 = tmp2.replaceAll("(\\n|\\r|\\s)+", ""); new_str.append(tmp2); } from = matcher.end(); if (tmp.charAt(0) == '\"' && !in_multiline_comment && !in_singleline_comment) { - magicMatcher = MAGIC_PATTERN.matcher(lc); + magicMatcher = LOOKBEHIND_PATTERN.matcher(lc); foundMagic = magicMatcher.find(); if (!in_string || !foundMagic || (magicMatcher.end() - magicMatcher.start()) % 2 == 0) { in_string = !in_string;