package test.language.antlr.StringTemplate; import java.io.ByteArrayOutputStream; import java.io.InputStreamReader; import java.io.StringWriter; import java.util.Map; import junit.framework.TestCase; import org.antlr.stringtemplate.StringTemplate; import org.antlr.stringtemplate.StringTemplateGroup; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.lilystudio.smarty4j.Context; import org.lilystudio.smarty4j.Engine; import org.lilystudio.smarty4j.IParser; import com.google.common.collect.Maps; import freemarker.template.Configuration; import freemarker.template.Template; public class StringTemplatePerformance extends TestCase { Log log = LogFactory.getLog(getClass()); public static class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } public void testBean() throws Exception { String expected = "<html>\r\n<head>\r\n<title>wangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilian</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; Person person = new Person(); person.name = "wangshilian"; int MAX = 1000 * 10; { String desc = "bean ST"; // setUp StringTemplateGroup templates = new StringTemplateGroup("mygroup", "src/test/java/test/language/antlr/StringTemplate"); // manually ask for an ST instance StringTemplate t = templates.getInstanceOf("stBean"); t.setAttribute("person", person); assertEquals(expected, t.toString()); long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { t.toString(); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } // { // String desc = "bean MyST"; // // setUp // // // STGroupDir templates = new // STGroupDir("src/test/java/test/language/antlr/StringTemplate",'$','$'); // // manually ask for an ST instance // ST t = new // ST("<html>\r\n<head>\r\n<title>$person.name$$person.name$$person.name$$person.name$$person.name$$person.name$$person.name$$person.name$$person.name$$person.name$</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>",'$','$'); // t.add("person", person); // assertEquals(expected, t.toString()); // // long start, end, nanoAll, nanoEvery; // // start = System.nanoTime(); // for (int i = 0; i < MAX; i++) { // t.render(); // } // end = System.nanoTime(); // nanoAll = end - start; // nanoEvery = nanoAll / MAX; // // System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", // desc, (nanoAll / (1000 * 1000)), +nanoEvery, // 1000 * 1000 * 1000 / nanoEvery); // } { String desc = "bean smarty4j"; // setUp Engine smartyEngine = new Engine(); org.lilystudio.smarty4j.Template template = smartyEngine.getTemplate("/src/test/java/test/language/antlr/StringTemplate/smarty4jBean.tpl"); Context context = new Context(); context.set("person", person); ByteArrayOutputStream out = new ByteArrayOutputStream(); template.merge(context, out); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { out = new ByteArrayOutputStream(1024); template.merge(context, out); // out.toString("utf-8"); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String desc = "bean smarty4j asm"; // setUp Engine smartyEngine = new Engine(); org.lilystudio.smarty4j.Template template = smartyEngine.getTemplate("/src/test/java/test/language/antlr/StringTemplate/smarty4jBean.tpl"); Context context = new Context(); context.set("person", person); ByteArrayOutputStream out = new ByteArrayOutputStream(); IParser p = template.toParser("myfirst"); StringWriter sw = new StringWriter(); p.merge(context, sw); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sw = new StringWriter(1024); p.merge(context, sw); // out.toString("utf-8"); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } /* * { String desc = "bean httl"; // setUp // Engine smartyEngine = new * Engine(); // org.lilystudio.smarty4j.Template template = * smartyEngine.getTemplate( * "/src/test/java/test/language/antlr/StringTemplate/smarty4jBean.tpl" * ); // Context context = new Context(); // context.set("person", * person); * * Map<String, Object> parameters = new HashMap<String, Object>(); * parameters.put("person", person); * * httl.Engine engine = httl.Engine.getEngine(); httl.Template template * = engine.getTemplate("httlBean.httl"); * * ByteArrayOutputStream out = new ByteArrayOutputStream(); // * template.merge(context, out); template.render(parameters, out); * * // prepare long start, end, nanoAll, nanoEvery; * * start = System.nanoTime(); for (int i = 0; i < MAX; i++) { out = new * ByteArrayOutputStream(); // template.merge(context, out); * template.render(parameters, out); // out.toString("utf-8"); } end = * System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; * * System.out.printf( * "[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n" * , desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / * nanoEvery); } */ { String desc = "bean Freemarker"; // setUp Configuration templateConfiguration = new Configuration(); Template ft = new Template("type", new InputStreamReader(this.getClass().getResourceAsStream("freemarkerBean.ftl")), templateConfiguration); Map<String, Object> root = Maps.newHashMap(); root.put("person", person); StringWriter sw = new StringWriter(); ft.process(root, sw); assertEquals(expected, sw.toString()); long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sw = new StringWriter(1024); ft.process(root, sw); // sw.toString(); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String desc = "bean javacode"; // setUp PageManual p = new PageManual(); Map<String, Object> root = Maps.newHashMap(); root.put("person", person); assertEquals(expected, p.compile2(root)); long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { p.compile2(root); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } } public void testStringValue() throws Exception { String expected = "<html>\r\n<head>\r\n<title>wangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilianwangshilian</title>\r\n<body>\r\n<hr>\r\n</body>\r\n</html>"; int MAX = 1000 * 10; { String desc = "string ST"; // setUp StringTemplateGroup templates = new StringTemplateGroup("mygroup", "src/test/java/test/language/antlr/StringTemplate"); // manually ask for an ST instance StringTemplate t = templates.getInstanceOf("stStringValue"); t.setAttribute("name", "wangshilian"); assertEquals(expected, t.toString()); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { t.toString(); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String desc = "string smarty4j"; // setUp Engine smartyEngine = new Engine(); org.lilystudio.smarty4j.Template template = smartyEngine.getTemplate("/src/test/java/test/language/antlr/StringTemplate/smarty4jStringValue.tpl"); Context context = new Context(); context.set("name", "wangshilian"); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { ByteArrayOutputStream out = new ByteArrayOutputStream(1024); template.merge(context, out); // out.toString("utf-8"); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String desc = "string smarty4j asm"; // setUp Engine smartyEngine = new Engine(); org.lilystudio.smarty4j.Template template = smartyEngine.getTemplate("/src/test/java/test/language/antlr/StringTemplate/smarty4jStringValue.tpl"); Context context = new Context(); context.set("name", "wangshilian"); ByteArrayOutputStream out = new ByteArrayOutputStream(); IParser p = template.toParser("myfirst"); StringWriter sw = new StringWriter(); p.merge(context, sw); // prepare long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sw = new StringWriter(1024); p.merge(context, sw); // out.toString("utf-8"); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String desc = "string freemarker"; // setUp Configuration templateConfiguration = new Configuration(); Template ft = new Template("type", new InputStreamReader(this.getClass().getResourceAsStream("freemarkerStringValue.ftl")), templateConfiguration); Map<String, Object> root = Maps.newHashMap(); root.put("name", "wangshilian"); StringWriter sw = new StringWriter(); ft.process(root, sw); assertEquals(expected, sw.toString()); long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { sw = new StringWriter(1024); ft.process(root, sw); // sw.toString(); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } { String desc = "string javacode"; // setUp PageManual p = new PageManual(); Map<String, Object> root = Maps.newHashMap(); root.put("name", "wangshilian"); assertEquals(expected, p.compile(root)); long start, end, nanoAll, nanoEvery; start = System.nanoTime(); for (int i = 0; i < MAX; i++) { p.compile(root); } end = System.nanoTime(); nanoAll = end - start; nanoEvery = nanoAll / MAX; System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery, 1000 * 1000 * 1000 / nanoEvery); } } };