package com.hubspot.jinjava.benchmarks.jinja2; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.hubspot.jinjava.Jinjava; import com.hubspot.jinjava.interpret.JinjavaInterpreter; import com.hubspot.jinjava.loader.FileLocator; import com.hubspot.jinjava.loader.ResourceLocator; import com.hubspot.jinjava.tree.Node; import ch.qos.logback.classic.Level; @State(Scope.Benchmark) public class Jinja2Benchmark { public String complexTemplate; public Map<String, ?> complexBindings; public Jinjava jinjava; public JinjavaInterpreter interpreter; public Node precompiledTemplate; @SuppressWarnings("unchecked") @Setup public void setup() throws IOException, NoSuchAlgorithmException { ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); logger.setLevel(Level.WARN); jinjava = new Jinjava(); interpreter = jinjava.newInterpreter(); FileLocator locator = new FileLocator(new File("jinja2/examples/rwbench/jinja")); final String helpersTemplate = locator.getString("helpers.html", StandardCharsets.UTF_8, interpreter); final String indexTemplate = locator.getString("index.html", StandardCharsets.UTF_8, interpreter); final String layoutTemplate = locator.getString("layout.html", StandardCharsets.UTF_8, interpreter); jinjava.setResourceLocator(new ResourceLocator() { @Override public String getString(String fullName, Charset encoding, JinjavaInterpreter interpreter) throws IOException { switch (fullName) { case "helpers.html": return helpersTemplate; case "layout.html": return layoutTemplate; case "index.html": return indexTemplate; } return null; } }); complexTemplate = indexTemplate; // for tag doesn't support postfix conditional filtering complexTemplate = complexTemplate.replaceAll(" if article.published", ""); List<User> users = Lists.newArrayList(new User("John Doe"), new User("Jane Doe"), new User("Peter Somewhat")); SecureRandom rnd = SecureRandom.getInstanceStrong(); List<Article> articles = new ArrayList<>(); for (int i = 0; i < 20; i++) { articles.add(new Article(i, users.get(rnd.nextInt(users.size())))); } List<ArrayList<String>> navigation = Lists.newArrayList( Lists.newArrayList("index", "Index"), Lists.newArrayList("about", "About"), Lists.newArrayList("foo?bar=1", "Foo with Bar"), Lists.newArrayList("foo?bar=2&s=x", "Foo with X"), Lists.newArrayList("blah", "Blub Blah"), Lists.newArrayList("hehe", "Haha")); complexBindings = ImmutableMap.of("users", users, "articles", articles, "navigation", navigation); precompiledTemplate = interpreter.parse(complexTemplate); } @Benchmark public String realWorldishBenchmark() { return jinjava.render(complexTemplate, complexBindings); } @Benchmark public String precompiledBenchmark() { return interpreter.render(precompiledTemplate, true); } public static void main(String[] args) throws Exception { Jinja2Benchmark b = new Jinja2Benchmark(); b.setup(); System.out.println(b.realWorldishBenchmark()); System.out.println(b.precompiledBenchmark()); System.out.println(b.precompiledBenchmark()); } }