From 2e5c374c6ed14a567893098484b72b13de25d20d Mon Sep 17 00:00:00 2001 From: Markus Perndorfer Date: Fri, 26 Oct 2018 16:44:02 +0200 Subject: [PATCH] add JTwig; update everything to the latest version --- README.md | 1 + pom.xml | 39 ++++++--- results.csv | 17 ++-- results.png | Bin 27099 -> 24733 bytes .../benchmark/BaseBenchmark.java | 5 +- .../com/mitchellbosecke/benchmark/JTwig.java | 34 ++++++++ .../resources/templates/stocks.thymeleaf.html | 2 +- src/main/resources/templates/stocks.twig.html | 82 ++++++++++++++++++ .../benchmark/ExpectedOutputTest.java | 7 ++ 9 files changed, 163 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/mitchellbosecke/benchmark/JTwig.java create mode 100755 src/main/resources/templates/stocks.twig.html diff --git a/README.md b/README.md index 9911e36..37262f7 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ JMH benchmark for popular Java template engines: * [Thymeleaf](http://www.thymeleaf.org/) * [Trimou](http://trimou.org/) * [Velocity](http://velocity.apache.org/) +* [JTwig](http://jtwig.org/) Running the benchmark ====================== diff --git a/pom.xml b/pom.xml index 8bb67c5..affe068 100644 --- a/pom.xml +++ b/pom.xml @@ -11,18 +11,21 @@ UTF-8 - 1.11.2 + + 1.21 benchmarks - 2.2.0 - 0.9.1 - 2.3.23 + 3.0.5 + 0.9.5 + 2.3.28 1.7 - 2.1.4.RELEASE + 3.0.10.RELEASE + 2.5.0.Final + 4.1.0 + 1.1.0 + 5.87.0.RELEASE + 4.12 - 1.8.2.Final - 4.0.1 - 0.10.3 @@ -47,8 +50,8 @@ maven-compiler-plugin 3.1 - 1.7 - 1.7 + 1.8 + 1.8 @@ -71,7 +74,7 @@ org.apache.maven.plugins maven-shade-plugin - 2.4.2 + 3.2.0 package @@ -121,7 +124,7 @@ - com.mitchellbosecke + io.pebbletemplates pebble ${pebble.version} @@ -161,6 +164,18 @@ ${rocker.version} + + org.jtwig + jtwig-core + ${jtwig.version} + + + org.slf4j + slf4j-nop + 1.7.25 + + + junit junit diff --git a/results.csv b/results.csv index 15c1737..f936b94 100644 --- a/results.csv +++ b/results.csv @@ -1,9 +1,10 @@ "Benchmark","Mode","Threads","Samples","Score","Score Error (99.9%)","Unit" -"com.mitchellbosecke.benchmark.Freemarker.benchmark","thrpt",1,50,15370.751504,496.200994,"ops/s" -"com.mitchellbosecke.benchmark.Handlebars.benchmark","thrpt",1,50,17779.570147,552.411776,"ops/s" -"com.mitchellbosecke.benchmark.Mustache.benchmark","thrpt",1,50,22164.070102,598.799830,"ops/s" -"com.mitchellbosecke.benchmark.Pebble.benchmark","thrpt",1,50,32530.043940,849.278116,"ops/s" -"com.mitchellbosecke.benchmark.Rocker.benchmark","thrpt",1,50,39739.408090,1152.244741,"ops/s" -"com.mitchellbosecke.benchmark.Thymeleaf.benchmark","thrpt",1,50,1084.191177,33.698132,"ops/s" -"com.mitchellbosecke.benchmark.Trimou.benchmark","thrpt",1,50,22787.431476,622.350790,"ops/s" -"com.mitchellbosecke.benchmark.Velocity.benchmark","thrpt",1,50,20835.819309,526.312411,"ops/s" +"com.mitchellbosecke.benchmark.Freemarker.benchmark","thrpt",1,50,21005.588634,76.531782,"ops/s" +"com.mitchellbosecke.benchmark.Handlebars.benchmark","thrpt",1,50,20524.566711,139.586152,"ops/s" +"com.mitchellbosecke.benchmark.JTwig.benchmark","thrpt",1,50,4102.884994,48.670670,"ops/s" +"com.mitchellbosecke.benchmark.Mustache.benchmark","thrpt",1,50,23762.734119,161.242965,"ops/s" +"com.mitchellbosecke.benchmark.Pebble.benchmark","thrpt",1,50,36038.987261,109.007888,"ops/s" +"com.mitchellbosecke.benchmark.Rocker.benchmark","thrpt",1,50,42106.221964,544.817884,"ops/s" +"com.mitchellbosecke.benchmark.Thymeleaf.benchmark","thrpt",1,50,6491.056248,42.856405,"ops/s" +"com.mitchellbosecke.benchmark.Trimou.benchmark","thrpt",1,50,26884.557477,145.348522,"ops/s" +"com.mitchellbosecke.benchmark.Velocity.benchmark","thrpt",1,50,22961.235663,83.661972,"ops/s" diff --git a/results.png b/results.png index 7ebb4481def9aac4cfe501b602f2cdcdd7640c60..3dc67078ce918877ddecf76d48f532d034d9976f 100644 GIT binary patch literal 24733 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≈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 literal 27099 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 Prices + th:class="${itemStat.odd}? 'odd' : 'even'"> diff --git a/src/main/resources/templates/stocks.twig.html b/src/main/resources/templates/stocks.twig.html new file mode 100755 index 0000000..7ee6566 --- /dev/null +++ b/src/main/resources/templates/stocks.twig.html @@ -0,0 +1,82 @@ + + + + Stock Prices + + + + + + + + + + + + +

Stock Prices

+ + + + + + + + + + + + + + {% for item in items -%} + {% set klass = (loop.index % 2 == 0) ? "even" : "odd" %} + + + + + + {% if (item.change < 0.0) %} + + + {% else %} + + + {% endif %} + + {% endfor -%} + +
#symbolnamepricechangeratio
{{ loop.index }} + {{ item.symbol }} + + {{ item.name }} + + {{ item.price }} + {{ item.change }}{{ item.ratio }}{{ item.change }}{{ item.ratio }}
+ + + diff --git a/src/test/java/com/mitchellbosecke/benchmark/ExpectedOutputTest.java b/src/test/java/com/mitchellbosecke/benchmark/ExpectedOutputTest.java index d883e26..dfe34b9 100644 --- a/src/test/java/com/mitchellbosecke/benchmark/ExpectedOutputTest.java +++ b/src/test/java/com/mitchellbosecke/benchmark/ExpectedOutputTest.java @@ -81,6 +81,13 @@ public void testHbsOutput() throws IOException { assertOutput(hbs.benchmark()); } + @Test + public void testJtwigOutput() throws Exception { + JTwig jTwig = new JTwig(); + jTwig.setup(); + assertOutput(jTwig.benchmark()); + } + private void assertOutput(final String output) throws IOException { assertEquals(readExpectedOutputResource(), output.replaceAll("\\s", "")); }