【问题标题】:Freemarker expression language using in java classjava类中使用的Freemarker表达式语言
【发布时间】:2020-07-31 02:10:30
【问题描述】:

我是一名大三学生,有一个任务。 我需要编写一个简单的应用程序来测试 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 表达式,以防止从外部文件读取更精确地进行性能测试。

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

附言我们要构建一个大应用程序,它可以处理大数据。我们计划使用 Freemarker 来处理这些数据。

【问题讨论】:

    标签: java freemarker


    【解决方案1】:

    确定您真正想要测量的阶段以及重量是至关重要的。上面您正在测量加载模板一次,并执行已解析的模板 100000 次。如果您不想测量模板加载和解析,那么只需将long startTime = ... 行放在getTemplate 行之后。

    一些进一步的说明:

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

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

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

      李>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2016-12-14
      • 2019-07-26
      相关资源
      最近更新 更多