Improve escaper performance
This commit is contained in:
6
pom.xml
6
pom.xml
@@ -52,6 +52,12 @@
|
|||||||
<version>1.3</version>
|
<version>1.3</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>3.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|||||||
@@ -1,28 +1,36 @@
|
|||||||
package j2html.utils;
|
package j2html.utils;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class SimpleEscaper {
|
public class SimpleEscaper {
|
||||||
|
|
||||||
private static Map<Character, String> map = new HashMap<Character, String>() {{
|
|
||||||
put('&', "&");
|
|
||||||
put('<', "<");
|
|
||||||
put('>', ">");
|
|
||||||
put('"', """);
|
|
||||||
put('\'', "'");
|
|
||||||
}};
|
|
||||||
|
|
||||||
public static String escape(String s) {
|
public static String escape(String s) {
|
||||||
if (s == null) {
|
if (s == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String escapedString = "";
|
StringBuilder escapedText = new StringBuilder();
|
||||||
for(char c : s.toCharArray()) {
|
char currentChar;
|
||||||
String escaped = map.get(c);
|
for (int i = 0; i < s.length(); i++) {
|
||||||
escapedString += escaped != null ? escaped : c;
|
currentChar = s.charAt(i);
|
||||||
|
switch (currentChar) {
|
||||||
|
case '<':
|
||||||
|
escapedText.append("<");
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
escapedText.append(">");
|
||||||
|
break;
|
||||||
|
case '&':
|
||||||
|
escapedText.append("&");
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
escapedText.append(""");
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
escapedText.append("'");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
escapedText.append(currentChar);
|
||||||
}
|
}
|
||||||
return escapedString;
|
}
|
||||||
|
return escapedText.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
49
src/test/java/j2html/PerformanceTest.java
Normal file
49
src/test/java/j2html/PerformanceTest.java
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package j2html;
|
||||||
|
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringEscapeUtils;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import j2html.utils.SimpleEscaper;
|
||||||
|
|
||||||
|
public class PerformanceTest {
|
||||||
|
|
||||||
|
private String shortTestString = "<body>\n"
|
||||||
|
+ " <h1 class=\"example\">Heading!</h1>\n"
|
||||||
|
+ " <img src=\"img/hello.png\">\n"
|
||||||
|
+ "</body>";
|
||||||
|
|
||||||
|
// syntax-highlighted getting started example from j2html.com:
|
||||||
|
private String longTestString =
|
||||||
|
"<pre class=\" language-java\"><code class=\" language-java\"><span class=\"token keyword\">import</span> <span class=\"token keyword\">static</span> j2html<span class=\"token punctuation\">.</span>TagCreator<span class=\"token punctuation\">.</span>*<span class=\"token punctuation\">;</span>\n"
|
||||||
|
+ "\n"
|
||||||
|
+ "<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Main</span> <span class=\"token punctuation\">{</span>\n"
|
||||||
|
+ " <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main<span class=\"token punctuation\">(</span></span>String<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n"
|
||||||
|
+ " <span class=\"token function\">body<span class=\"token punctuation\">(</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">with<span class=\"token punctuation\">(</span></span>\n"
|
||||||
|
+ " <span class=\"token function\">h1<span class=\"token punctuation\">(</span></span><span class=\"token string\">\"Heading!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">withClass<span class=\"token punctuation\">(</span></span><span class=\"token string\">\"example\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n"
|
||||||
|
+ " <span class=\"token function\">img<span class=\"token punctuation\">(</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">withSrc<span class=\"token punctuation\">(</span></span><span class=\"token string\">\"img/hello.png\"</span><span class=\"token punctuation\">)</span>\n"
|
||||||
|
+ " <span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">render<span class=\"token punctuation\">(</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n"
|
||||||
|
+ " <span class=\"token punctuation\">}</span>\n"
|
||||||
|
+ "<span class=\"token punctuation\">}</span>\n"
|
||||||
|
+ "</code></pre>";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_escaper_performnce() throws Exception {
|
||||||
|
timeEscaper("SimpleEscaper#short", () -> SimpleEscaper.escape(shortTestString));
|
||||||
|
timeEscaper("SimpleEscaper#long", () -> SimpleEscaper.escape(longTestString));
|
||||||
|
timeEscaper("ApacheEscaper#short", () -> StringEscapeUtils.escapeHtml4(shortTestString));
|
||||||
|
timeEscaper("ApacheEscaper#long", () -> StringEscapeUtils.escapeHtml4(longTestString));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void timeEscaper(String name, Callable escaper) throws Exception {
|
||||||
|
long startTime = System.nanoTime();
|
||||||
|
for (int i = 0; i < 1000; i++) {
|
||||||
|
escaper.call();
|
||||||
|
}
|
||||||
|
long endTime = System.nanoTime();
|
||||||
|
long durationMs = (endTime - startTime) / 1000000;
|
||||||
|
System.out.println(String.format("%-21s%s", name + ":", +durationMs + "ms"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user