Improve escaper performance
This commit is contained in:
6
pom.xml
6
pom.xml
@@ -52,6 +52,12 @@
|
||||
<version>1.3</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<packaging>jar</packaging>
|
||||
|
||||
@@ -1,28 +1,36 @@
|
||||
package j2html.utils;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class SimpleEscaper {
|
||||
|
||||
private static Map<Character, String> map = new HashMap<Character, String>() {{
|
||||
put('&', "&");
|
||||
put('<', "<");
|
||||
put('>', ">");
|
||||
put('"', """);
|
||||
put('\'', "'");
|
||||
}};
|
||||
|
||||
public static String escape(String s) {
|
||||
if(s == null) {
|
||||
if (s == null) {
|
||||
return null;
|
||||
}
|
||||
String escapedString = "";
|
||||
for(char c : s.toCharArray()) {
|
||||
String escaped = map.get(c);
|
||||
escapedString += escaped != null ? escaped : c;
|
||||
StringBuilder escapedText = new StringBuilder();
|
||||
char currentChar;
|
||||
for (int i = 0; i < s.length(); i++) {
|
||||
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