package http.resource;
import java.io.File;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
import nebula.data.Broker;
import nebula.data.DataStore;
import nebula.data.Entity;
import nebula.data.impl.TypeDatastore;
import nebula.lang.EditableTypeLoader;
import nebula.lang.SystemTypeLoader;
import nebula.lang.Type;
import nebula.lang.TypeLoader;
import nebula.simpletemplate.ST;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class TemplatePerformanceNow extends TestCase {
Log log = LogFactory.getLog(this.getClass());
// Configuration templateConfig;
DataStore<Entity> attributes;
TypeLoader typeLoader;
// DataRepos dataWareHouse;
TypeDatastore typeBrokers;
static final String PATH_OF_ROOT = "htdocs2";
protected void setUp() throws Exception {
Broker.clear();
// ROOT Folder
File root = null;
URL url = this.getClass().getResource("/" + PATH_OF_ROOT + "/WEB-INF/web.xml");
if (url != null) {
root = new File(url.getPath()).getParentFile().getParentFile();
}
if (root == null) {
root = new File(PATH_OF_ROOT);
}
if (!root.exists()) {
throw new RuntimeException("cannot find " + PATH_OF_ROOT);
}
// Type Define locator
EditableTypeLoader typeLoader = new EditableTypeLoader(new SystemTypeLoader(), new File("apps/system"));
typeLoader.registerPath(new File("apps/ids"));
this.typeBrokers = new TypeDatastore(typeLoader);
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public final void testPerfomance() throws Exception {
Type type = this.typeBrokers.getBroker("Person");
String template = "${type.fields : {f| { ${f.name} , ${f.type.name} \\} }}";
String freemarkerTemplate = "<#list type.fields as f>{ ${f.name} , ${f.type.name} } </#list>";
String expected = "{ Name , Name } { Birthday , Birthday } { Height , Height } { Age , Age } { Sex , Sex } { Detail , Person$Detail } { Company , Company } { Roles1 , Text } { Roles2 , Long } { Roles3 , Date } { Roles4 , Time } { Education , Person$Education } ";
type = Broker.brokerOf(type).get();
ST st = new ST(template,'$','}');
int MAX = 1000 * 1;
{
String desc = "type simpletempl";
// setUp
// prepare
long start, end, nanoAll, nanoEvery;
assertEquals(expected, st.render(type));
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
st.render(type);
}
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 = "type ST";
// // setUp
// // template =
// // "<type.fields : { f | \\{ <f.name> , <f.type.name> \\} }>";
// // template = "<type.name>";
//
// org.stringtemplate.v4.ST t = new org.stringtemplate.v4.ST(template, '$', '}');
// // manually ask for an ST instance
// t.add("type", type);
// assertEquals(expected, t.render());
//
// // prepare
// 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 = "type freemarker";
// setUp
// template = "${type.name}";
Configuration templateConfiguration = new Configuration();
Template ft = new Template("test", new StringReader(freemarkerTemplate), templateConfiguration);
Map<String, Object> root = new HashMap<String, Object>();
root.put("type", type);
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();
ft.process(root, sw);
}
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 = "type javacode";
// setUp
ActionComplier_test_TEST_0 p = new ActionComplier_test_TEST_0();
StringBuilder sb = new StringBuilder();
Object[] params = new Object[] { type };
p.exec(null, null, sb, params);
assertEquals(expected, sb.toString());
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
sb.setLength(0);
p.exec(null, null, sb, params);
sb.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);
}
}
public final void testPerfomance_JavaCode() throws Exception {
Type type = this.typeBrokers.getBroker("Person");
String expected = "{ Name , Name } { Birthday , Birthday } { Height , Height } { Age , Age } { Sex , Sex } { Detail , Person$Detail } { Company , Company } { Roles1 , Text } { Roles2 , Long } { Roles3 , Date } { Roles4 , Time } { Education , Person$Education } ";
type = Broker.brokerOf(type).get();
int MAX = 1000 *100;
{
String desc = "type javacode";
// setUp
ActionComplier_test_TEST_0 p = new ActionComplier_test_TEST_0();
StringBuilder sb = new StringBuilder();
Object[] params = new Object[] { type };
p.exec(null, null, sb, params);
assertEquals(expected, sb.toString());
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
sb.setLength(0);
p.exec(null, null, sb, params);
sb.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);
}
}
}