[在Java类中使用的Freemarker表达式语言

问题描述 投票:0回答:1

我是一名大三学生,得到了一项任务。我需要编写一个简单的应用程序来测试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();
    }
}

需要帮助弄清楚如何在主类中使用Freemarker表达式,以防止在性能测试中更精确地读取外部文件。

很高兴听到您的所有建议。

ps.s。我们将要构建一个大应用程序,它将与大数据一起使用。我们计划使用Freemarker处理这些数据。

java freemarker
1个回答
0
投票

决定真正要测量的相位以及权重的关键。在上面,您要测量一次加载模板,并执行已解析的模板100000次。如果您不想测量模板的加载和解析,则只需将long startTime = ...行放在getTemplate行之后。

一些其他说明:

  • 模板写入的内容可能很重要,有时很多。您正在写到控制台,但实际的应用程序不会。如果只想排除该因素,则使用freemarker.template.utility.NullWriter.INSTANCE作为输出。

  • 您应该做一些“热身”,以便JIT可以完成其工作。所以也许整个运行在开始实际测量之前,请先测试数百次。

  • 数据模型(data)也将被包装100000次。如果许多小模板将读取相同的数据,则最好通过TemplateHashModel wrappedData = (TemplateHashModel) config.getObjectWrapper().wrap(data)进行预包装,然后再将wrappedData传递给不同模板的process调用。

© www.soinside.com 2019 - 2024. All rights reserved.