Язык выражения Freemarker, использующий класс java - PullRequest
0 голосов
/ 17 апреля 2020

Я младший и получил задание. Мне нужно написать простое приложение для проверки производительности выражения 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 Мы собираемся создать большое приложение, которое будет работать с большими данными. И мы планируем использовать Freemarker для обработки этих данных.

1 Ответ

0 голосов
/ 17 апреля 2020

Очень важно решить, какие фазы вы действительно хотите измерить и с каким весом. Выше вы измеряете загрузку шаблона один раз и выполняете уже проанализированный шаблон 100000 раз. Если вы не хотите измерять загрузку и анализ шаблона, просто поставьте строку long startTime = ... после строки getTemplate.

Некоторые дополнительные примечания:

  • То, во что пишут шаблоны, может иметь значение, иногда очень много. Вы пишете в консоль, но реального приложения не будет. Если вы просто хотите исключить этот фактор, тогда используйте freemarker.template.utility.NullWriter.INSTANCE для вывода.

  • Вы должны сделать некоторую «разминку», чтобы JIT мог выполнять свою работу. Так что, возможно, запустите весь тест несколько сотен раз, прежде чем начинать фактическое измерение.

  • Модель данных (data) будет также обернута 100000 раз. Если множество маленьких шаблонов будет считывать одни и те же данные, то, возможно, будет хорошей идеей предварительно обернуть их с помощью TemplateHashModel wrappedData = (TemplateHashModel) config.getObjectWrapper().wrap(data), а затем передать wrappedData на process вызовы различных шаблонов позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...