-
Notifications
You must be signed in to change notification settings - Fork 0
JMH
Your JMH benchmarks can generate a number of JSON files storing benchmark results, but it is difficult to produce a good-looking graph from them. Carte-JMH was written to produce graphs and tables that can be displayed on a website (see the CSS4J Benchmark results).
To run the benchmark report app on JMH-produced JSON files, you have to prepare an XML configuration file and execute:
./gradlew build uberjar
java -jar carte-jmh/build/libs/carte-jmh-<version>-all.jar --config=<path-to-config-file> *.json
The generic elements of the XML configuration file are described in the Configuration page, but Carte-JMH adds its own configurations that are better explained with a real example.
https://github.com/css4j/carte/blob/master/carte-jmh/examples/sac-benchmark.xml
As described in the Configuration page, the root is a <reportdef>
element with a <name>
child.
<name>SAC benchmarks</name>
Then, look at the following lines that declare a benchmark based on SACBenchmark.java:
<benchmark id="sac-226kb">
<class>io.sf.carte.mark.css.SACBenchmark</class>
<caption>SAC benchmark</caption>
<subcaption>Medium-large file (226 kB)</subcaption>
</benchmark>
You can add as many <benchmark>
elements as you like.
One should provide a description for the X axis:
<x-axis-title>SAC Implementation</x-axis-title>
And you probably want to assign more readable descriptions (together with specific colours) to the methods in the benchmarks. For which you will use regular expressions in <method>
elements:
<methods>
<method regex=".+SACParseStyleSheet$" color="#c04d4d">Css4j</method>
<method regex=".+Batik$" color="#61c061">Batik CSS</method>
<method regex=".+SSParser$" color="#4d4dc0">SS CSSParser</method>
</methods>
Now, give a description to the units:
<units>
<unit-title unit-id="ops/s">Throughput (ops/s)</unit-title>
<unit-title unit-id="ops/ms">Throughput (ops/ms)</unit-title>
<unit-title unit-id="ops/us">Throughput (ops/μs)</unit-title>
<unit-title unit-id="ops/ns">Throughput (ops/ns)</unit-title>
<unit-title unit-id="s/op">Average time per operation (s)</unit-title>
<unit-title unit-id="ms/op">Average time per operation (ms)</unit-title>
<unit-title unit-id="us/op">Average time per operation (μs)</unit-title>
<unit-title unit-id="ns/op">Average time per operation (ns)</unit-title>
</units>
The <storage>
element declares the different data/graph stores (see the Configuration page for more details):
<storage>
<store id="fileStore" classname="io.sf.carte.report.FileStore">
<directory>${java.io.tmpdir}/benchmark</directory>
</store>
<store id="documentStore" classname="io.sf.carte.report.DocumentStore">
<pathname>${user.home}/www/css4j.github.io/sac-mark.html</pathname>
<fallback baseuri="benchmark" format="png">
${user.home}/www/css4j.github.io/benchmark
</fallback>
</store>
</storage>
-
The element with a
fileStore
id tells that the directory~/www/css4j.github.io/benchmark
would be aFileStore
containing the fallback images. -
In the element with
documentStore
id of that file, it is configured that the file~/www/css4j.github.io/sac-mark.html
is aDocumentStore
where the SVG graphs will be put.
To produce the SAC tables and graphs on your own, all that you have to do is to download your copy of the sac-mark.html
file and modify the paths in sac-benchmark.xml
as necessary.
Then you could prepare a small script called sac-benchmark-charts.sh
and put it in carte-jmh/examples
:
#!/usr/bin/bash
CARTE_VERSION=0.1.0-SNAPSHOT
java -jar ../build/libs/carte-jmh-${CARTE_VERSION}-all.jar --config=sac-benchmark.xml "$@"
Now open a shell and execute it (again, in carte-jmh/examples
which contains all the JSON files):
cd carte-jmh/examples
./sac-benchmark-charts.sh sac*.json
And you will reproduce the SAC JMH charts.
The examples
directory contains a similar benchmark-charts.sh
script that produces the DOM benchmarks instead.