package nebula.simpletemplate; import java.io.IOException; import java.util.Map; import junit.framework.TestCase; import com.google.common.collect.Maps; public class ST_PerformanceTest extends TestCase { @Override protected void setUp() throws Exception { } public void testSimpleVar() throws IOException { int MAX = 1000 * 10; { String expected = "<html>\r\n<head>\r\n<title>wangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilian</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; String text = "<html>\r\n<head>\r\n<title>${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; ST st = new ST(text, '$', '}'); String desc = "type"; // setUp Person person = new Person(); person.setName("wangshilian"); assertEquals(expected, st.render(person)); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { st.render(person); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String expected = "<html>\r\n<head>\r\n<title>wangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilian</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; String text = "<html>\r\n<head>\r\n<title>${name}${name}${name}${name}${name}${name}${name}${name}${name}${name}</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; ST st = new ST(text, '$', '}'); String desc = "map"; // setUp Map<String, String> root = Maps.newHashMap(); root.put("name", "wangshilian"); assertEquals(expected, st.renderNamed(root)); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { st.renderNamed(root); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } MAX = 1000 * 1; // { // String expected = "<html>\r\n<head>\r\n<title>wangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilian</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; // String text = "<html>\r\n<head>\r\n<title>${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}${at.name}</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; // // org.stringtemplate.v4.ST st = new org.stringtemplate.v4.ST(text, '$', '}'); // String desc = "ST type"; // Person person = new Person(); // person.setName("wangshilian"); // // setUp // st.add("at", person); // // assertEquals(expected, st.render()); // // prepare // long start, end, nanoAll, nanoEvery; // start = System.nanoTime(); // for (int i = 0; i < MAX; i++) { // st.render(); // } // end = System.nanoTime(); // nanoAll = end - start; // nanoEvery = nanoAll / MAX; // // System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, // 1000 * 1000 * 1000 / nanoEvery); // } // { // String expected = "<html>\r\n<head>\r\n<title>wangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilian</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; // String text = "<html>\r\n<head>\r\n<title>${name}${name}${name}${name}${name}${name}${name}${name}${name}${name}</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; // // org.stringtemplate.v4.ST st = new org.stringtemplate.v4.ST(text, '$', '}'); // String desc = "ST map"; // // setUp // st.add("name", "wangshilian"); // // assertEquals(expected, st.render()); // // prepare // long start, end, nanoAll, nanoEvery; // start = System.nanoTime(); // for (int i = 0; i < MAX; i++) { // st.render(); // } // end = System.nanoTime(); // nanoAll = end - start; // nanoEvery = nanoAll / MAX; // // System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, // 1000 * 1000 * 1000 / nanoEvery); // } { String desc = "new StringBuilder(1024)"; // setUp // prepare long start, end, nanoAll, nanoEvery; @SuppressWarnings("unused") StringBuilder sb = null; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sb = new StringBuilder(1024); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } return; } public void testSubTemplate() throws IOException { String expected = "<html>\r\n<head>\r\n<title>print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; String text = "<html>\r\n<head>\r\n<title>${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; int MAX = 1000 * 10; { String desc = "javacode sub temp"; // setUp Map<String, String> root = Maps.newHashMap(); root.put("name", "wangshilian"); TestSubTemplate_Normal a = new TestSubTemplate_Normal(); StringBuilder sb = new StringBuilder(); Object[] params = new Object[] { "wangshilian" }; a.exec(null, null, sb, params); assertEquals(expected, sb.toString()); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sb.setLength(0); a.exec(null, null, sb, params); sb.toString(); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String desc = "created javacode sub temp"; // setUp Map<String, String> root = Maps.newHashMap(); root.put("name", "wangshilian"); ActionComplier_anonymous__java_lang_String_0 a = new ActionComplier_anonymous__java_lang_String_0(); StringBuilder sb = new StringBuilder(); Object[] params = new Object[] { "wangshilian" }; a.exec(null, null, sb, params); assertEquals(expected, sb.toString()); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sb.setLength(0); a.exec(null, null, sb, params); sb.toString(); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { ST st = new ST(text, '$', '}'); String desc = "sub temp"; // setUp Map<String, String> root = Maps.newHashMap(); root.put("name", "wangshilian"); assertEquals(expected, st.renderNamed(root)); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { st.renderNamed(root); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } // { // MAX = MAX / 10; // org.stringtemplate.v4.ST st = new org.stringtemplate.v4.ST(text, '$', '}'); // String desc = "ST sub temp"; // // setUp // st.add("name", "wangshilian"); // // assertEquals(expected, st.render()); // // prepare // long start, end, nanoAll, nanoEvery; // start = System.nanoTime(); // for (int i = 0; i < MAX; i++) { // st.render(); // } // end = System.nanoTime(); // nanoAll = end - start; // nanoEvery = nanoAll / MAX; // // System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, // 1000 * 1000 * 1000 / nanoEvery); // } return; } public void testSubTemplate_javacode() throws IOException { String expected = "<html>\r\n<head>\r\n<title>print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)print(wangshilian)</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; // String text = // "<html>\r\n<head>\r\n<title>${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}${name:{x| print(${x})}}</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; int MAX = 1000 * 10; { String desc = "normal"; // setUp Map<String, String> root = Maps.newHashMap(); root.put("name", "wangshilian"); TestSubTemplate_Normal a = new TestSubTemplate_Normal(); StringBuilder sb = new StringBuilder(); Object[] params = new Object[] { "wangshilian" }; a.exec(null, null, sb, params); assertEquals(expected, sb.toString()); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sb.setLength(0); a.exec(null, null, sb, params); sb.toString(); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String desc = "final static"; // setUp Map<String, String> root = Maps.newHashMap(); root.put("name", "wangshilian"); StringBuilder sb = new StringBuilder(); Object[] params = new Object[] { "wangshilian" }; TestSubTemplate_FinalStatic.exec(null, null, sb, params); assertEquals(expected, sb.toString()); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sb.setLength(0); TestSubTemplate_FinalStatic.exec(null, null, sb, params); sb.toString(); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String desc = "inline"; // setUp Map<String, String> root = Maps.newHashMap(); root.put("name", "wangshilian"); TestSubTemplate_Inline a = new TestSubTemplate_Inline(); StringBuilder sb = new StringBuilder(); Object[] params = new Object[] { "wangshilian" }; a.exec(null, null, sb, params); assertEquals(expected, sb.toString()); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sb.setLength(0); a.exec(null, null, sb, params); sb.toString(); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ]\tAll :%8d ms; \tevery : %8d nano;\tone second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } return; } }