簡體   English   中英

Freemarker 表達語言在 java class 中使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM