[英]Freemarker expression language using in java class
我是小学生,有任务。 我需要编写简单的应用程序来测试 Freemarker 表达式的性能。
Map<String, Object> data = new HashMap<String, Object>();
data.put("firstString", "13");
data.put("secondString", "17");
条件:${(firstString + secondString)?number};
目标是重复该过程 100.000 次(解析模板、设置变量、评估模板)并以毫秒为单位评估性能。
public static void main(String[] args) throws IOException {
Configuration cfg = new Configuration();
try {
long startTime = System.nanoTime();
// Connect to Freemarker template
Template template = cfg.getTemplate("src/concatenation.ftl");
// Create data to use in expresion String to number = ${(firstString + secondString)?number}
Map<String, Object> data = new HashMap<String, Object>();
data.put("firstString", "13");
data.put("secondString", "17");
for (int i = 0; i < 100_000 ; i++) {
// Console output
Writer out = new OutputStreamWriter(System.out);
template.process(data, out);
out.flush();
}
// Measure performance time
long endTime = System.nanoTime();
long duration = (endTime - startTime);
System.out.println();
System.out.println("Parse template for 100.000 objects completed in " + duration / 1000000 + " milliseconds");
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
需要帮助弄清楚如何在主 class 中使用 Freemarker 表达式,以防止在性能测试中更精确地从外部文件读取。
很高兴听到您的所有建议。
ps 我们要构建一个大应用程序,它可以处理大数据。 我们计划使用 Freemarker 来处理这些数据。
决定您真正想要测量的阶段以及重量是至关重要的。 上面您正在测量加载模板一次,并执行已解析的模板 100000 次。 如果您不想测量模板加载和解析,那么只需将long startTime =...
行放在getTemplate
行之后。
一些进一步的说明:
模板写入的内容可能很重要,有时很重要。 您正在写入控制台,但真正的应用程序不会。 如果你只是想排除这个因素,那么对 output 使用freemarker.template.utility.NullWriter.INSTANCE
。
您应该做一些“热身”,以便 JIT 可以完成它的工作。 因此,在开始实际测量之前,可能会运行整个测试数百次。
数据 model ( data
) 也将被包装 100000 次。 如果很多小模板会读取相同的数据,那么最好通过TemplateHashModel wrappedData = (TemplateHashModel) config.getObjectWrapper().wrap(data)
预先包装它,然后将wrappedData
传递给不同的process
调用以后的模板。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.