From fcd7aa68dc3fbb8ad1545593a49745be5ca66cf5 Mon Sep 17 00:00:00 2001 From: Mitchell Bosecke Date: Sun, 1 Mar 2015 23:09:16 -0700 Subject: [PATCH] Renamed benchmarks and added a gnuplot script file to make plots --- README.md | 44 ++++++------------ benchmark.plot | 30 ++++++++++++ results.csv | 10 ++-- results.png | Bin 9648 -> 21288 bytes ...eemarkerBenchmark.java => Freemarker.java} | 2 +- ...{MoustacheBenchmark.java => Mustache.java} | 24 +++++----- .../{PebbleBenchmark.java => Pebble.java} | 2 +- ...ThymeleafBenchmark.java => Thymeleaf.java} | 2 +- .../{VelocityBenchmark.java => Velocity.java} | 2 +- 9 files changed, 66 insertions(+), 50 deletions(-) create mode 100644 benchmark.plot rename src/main/java/com/mitchellbosecke/benchmark/{FreemarkerBenchmark.java => Freemarker.java} (94%) rename src/main/java/com/mitchellbosecke/benchmark/{MoustacheBenchmark.java => Mustache.java} (68%) rename src/main/java/com/mitchellbosecke/benchmark/{PebbleBenchmark.java => Pebble.java} (95%) rename src/main/java/com/mitchellbosecke/benchmark/{ThymeleafBenchmark.java => Thymeleaf.java} (94%) rename src/main/java/com/mitchellbosecke/benchmark/{VelocityBenchmark.java => Velocity.java} (95%) diff --git a/README.md b/README.md index 975fdf8..3c9c089 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,24 @@ template-benchmark ================ -JMH benchmark for the the most popular Java template engines. +JMH benchmark for the popular Java template engines: +1. Freemarker +2. Mustache +3. Pebble +4. Thymeleaf +5. Velocity + +Running the benchmark +====================== 1. Download the source code and build it (`mvn clean install`) 2. Run the benchmark suite with `java -jar target/benchmarks.jar` +Generating plot +=============== +1. Run benchmark while exporting results to csv with `java -jar target/benchmarks.jar -rff results.csv -rf csv` +2. Use gnuplot to generate plot with `gnuplot benchmark.plot`. This will output `results.png`. + Rules of Template Engine Configuration ====================================== It is imperative that each template engine is configured in way to reflect real-world usage as opposed to it's *optimal* configuration. Typically this means an out-of-the-box configuration. @@ -19,34 +32,7 @@ Interpreting the Results The benchmarks measure throughput, given in "ops/time". The time unit used is seconds. Generally, the score represents the number of templates rendered per second; the higher the score, the better. -Example Output +Example Results =============== -The following benchmark was run on a machine with the following stats: - -* OS: CentOS 7 -* Kernel: 3.10.0-123.el7.x86_64 -* Memory: 8GB -* Processor: Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz - -```` -# JMH 1.6.1 (released 4 days ago) -# VM invoker: /usr/java/jdk1.7.0_67/jre/bin/java -# VM options: -# Warmup: 5 iterations, 1 s each -# Measurement: 10 iterations, 1 s each -# Timeout: 10 min per iteration -# Threads: 1 thread, will synchronize iterations -# Benchmark mode: Throughput, ops/time - -(...) -# Run complete. Total time: 00:06:23 - -Benchmark Mode Cnt Score Error Units -FreemarkerBenchmark.benchmark thrpt 50 14886.563 ± 128.597 ops/s -MoustacheBenchmark.benchmark thrpt 50 32821.125 ± 284.831 ops/s -PebbleBenchmark.benchmark thrpt 50 26547.355 ± 311.757 ops/s -ThymeleafBenchmark.benchmark thrpt 50 756.536 ± 16.601 ops/s -VelocityBenchmark.benchmark thrpt 50 18388.098 ± 59.178 ops/s -```` ![Template Comparison](results.png) diff --git a/benchmark.plot b/benchmark.plot new file mode 100644 index 0000000..b5e5243 --- /dev/null +++ b/benchmark.plot @@ -0,0 +1,30 @@ +# Labels +set title 'Java Template Engine Performance Comparison' +set ylabel 'Templates rendered per second' +set xlabel 'Template Engine' +set xtics nomirror rotate by -45 + +# Ranges +set autoscale + +# Input +set datafile separator ',' + +# Output +set terminal pngcairo enhanced font "Verdana,9" +set output 'results.png' +set grid +set key off +set boxwidth 0.8 relative + +# box style +set style line 1 lc rgb '#5C91CD' lt 1 +set style fill solid + +# remove top and right borders +set style line 2 lc rgb '#808080' lt 1 +set border 3 back ls 2 +set tics nomirror + +plot 'results.csv' every ::1 using 0:5:xticlabels(stringcolumn(1)[31:36]) with boxes ls 1,\ + 'results.csv' every ::1 using 0:($5 + 1500):(sprintf("%d",$5)) with labels diff --git a/results.csv b/results.csv index 05e6c0b..d812807 100644 --- a/results.csv +++ b/results.csv @@ -1,6 +1,6 @@ "Benchmark","Mode","Threads","Samples","Score","Score Error (99.9%)","Unit" -"com.mitchellbosecke.benchmark.FreemarkerBenchmark.benchmark","thrpt",1,50.000000,14963.742414,107.939165,"ops/s" -"com.mitchellbosecke.benchmark.MoustacheBenchmark.benchmark","thrpt",1,50.000000,32836.315928,135.504102,"ops/s" -"com.mitchellbosecke.benchmark.PebbleBenchmark.benchmark","thrpt",1,50.000000,27515.889592,324.357246,"ops/s" -"com.mitchellbosecke.benchmark.ThymeleafBenchmark.benchmark","thrpt",1,50.000000,788.701841,11.296145,"ops/s" -"com.mitchellbosecke.benchmark.VelocityBenchmark.benchmark","thrpt",1,50.000000,18830.615978,141.901540,"ops/s" +"com.mitchellbosecke.benchmark.Freemarker.benchmark","thrpt",1,50.000000,14923.957014,178.214593,"ops/s" +"com.mitchellbosecke.benchmark.Moustache.benchmark","thrpt",1,50.000000,38353.921882,292.072738,"ops/s" +"com.mitchellbosecke.benchmark.Pebble.benchmark","thrpt",1,50.000000,33269.274946,263.750858,"ops/s" +"com.mitchellbosecke.benchmark.Thymeleaf.benchmark","thrpt",1,50.000000,967.923884,11.037038,"ops/s" +"com.mitchellbosecke.benchmark.Velocity.benchmark","thrpt",1,50.000000,19896.369833,134.624876,"ops/s" diff --git a/results.png b/results.png index 8941000d012c143e1616b427cba6bb1ed8117c23..0cc8715227776b536382b2b728db650d7275bd35 100644 GIT binary patch literal 21288 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 literal 9648 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 context; diff --git a/src/main/java/com/mitchellbosecke/benchmark/MoustacheBenchmark.java b/src/main/java/com/mitchellbosecke/benchmark/Mustache.java similarity index 68% rename from src/main/java/com/mitchellbosecke/benchmark/MoustacheBenchmark.java rename to src/main/java/com/mitchellbosecke/benchmark/Mustache.java index 90deaec..c6e47aa 100644 --- a/src/main/java/com/mitchellbosecke/benchmark/MoustacheBenchmark.java +++ b/src/main/java/com/mitchellbosecke/benchmark/Mustache.java @@ -5,32 +5,32 @@ import java.io.Writer; import java.util.Map; -import com.github.mustachejava.MustacheException; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Setup; import com.github.mustachejava.DefaultMustacheFactory; -import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheException; import com.github.mustachejava.MustacheFactory; -public class MoustacheBenchmark extends BaseBenchmark { +public class Mustache extends BaseBenchmark { private Map context; - private Mustache template; + private com.github.mustachejava.Mustache template; @Setup public void setup() { MustacheFactory mustacheFactory = new DefaultMustacheFactory() { - @Override - public void encode(String value, Writer writer) { - // Disable HTML escaping - try { - writer.write(value); - } catch (IOException e) { - throw new MustacheException(e); + + @Override + public void encode(String value, Writer writer) { + // Disable HTML escaping + try { + writer.write(value); + } catch (IOException e) { + throw new MustacheException(e); + } } - } }; template = mustacheFactory.compile("templates/stocks.mustache.html"); this.context = getContext(); diff --git a/src/main/java/com/mitchellbosecke/benchmark/PebbleBenchmark.java b/src/main/java/com/mitchellbosecke/benchmark/Pebble.java similarity index 95% rename from src/main/java/com/mitchellbosecke/benchmark/PebbleBenchmark.java rename to src/main/java/com/mitchellbosecke/benchmark/Pebble.java index 279a0d1..cdf5d3a 100644 --- a/src/main/java/com/mitchellbosecke/benchmark/PebbleBenchmark.java +++ b/src/main/java/com/mitchellbosecke/benchmark/Pebble.java @@ -12,7 +12,7 @@ import com.mitchellbosecke.pebble.extension.escaper.EscaperExtension; import com.mitchellbosecke.pebble.template.PebbleTemplate; -public class PebbleBenchmark extends BaseBenchmark { +public class Pebble extends BaseBenchmark { private Map context; diff --git a/src/main/java/com/mitchellbosecke/benchmark/ThymeleafBenchmark.java b/src/main/java/com/mitchellbosecke/benchmark/Thymeleaf.java similarity index 94% rename from src/main/java/com/mitchellbosecke/benchmark/ThymeleafBenchmark.java rename to src/main/java/com/mitchellbosecke/benchmark/Thymeleaf.java index 9c0a956..f131fd0 100644 --- a/src/main/java/com/mitchellbosecke/benchmark/ThymeleafBenchmark.java +++ b/src/main/java/com/mitchellbosecke/benchmark/Thymeleaf.java @@ -14,7 +14,7 @@ import freemarker.template.TemplateException; -public class ThymeleafBenchmark extends BaseBenchmark { +public class Thymeleaf extends BaseBenchmark { private TemplateEngine engine; diff --git a/src/main/java/com/mitchellbosecke/benchmark/VelocityBenchmark.java b/src/main/java/com/mitchellbosecke/benchmark/Velocity.java similarity index 95% rename from src/main/java/com/mitchellbosecke/benchmark/VelocityBenchmark.java rename to src/main/java/com/mitchellbosecke/benchmark/Velocity.java index 86be5dd..b6ba678 100644 --- a/src/main/java/com/mitchellbosecke/benchmark/VelocityBenchmark.java +++ b/src/main/java/com/mitchellbosecke/benchmark/Velocity.java @@ -10,7 +10,7 @@ import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Setup; -public class VelocityBenchmark extends BaseBenchmark { +public class Velocity extends BaseBenchmark { private VelocityContext context;