The Renaissance Benchmark Suite aggregates common modern JVM workloads, including, but not limited to, Big Data, machine-learning, and functional programming. The suite is intended to be used to optimize just-in-time compilers, interpreters, GCs, and for tools such as profilers, debuggers, or static analyzers, and even different hardware. It is intended to be an open-source, collaborative project, in which the community can propose and improve benchmark workloads.
To run the suite, you will need to download a Renaissance Suite JAR from https://renaissance.dev/download. If you wish to build it yourself, please, consult CONTRIBUTING.md for instructions on building.
To run a Renaissance benchmark, you need to have a JRE version 11 (or later)
installed and execute the following java
command:
$ java -jar 'renaissance-gpl-0.15.0.jar' <benchmarks>
In the above command, <benchmarks>
is the list of benchmarks that you want to run.
You can refer to individual benchmarks, e.g., scala-kmeans
, or a group of benchmarks,
e.g., apache-spark
.
The suite generally executes the benchmark's measured operation multiple times. By default, the suite executes each benchmark operation for a specific number of times. The benchmark-specific number of repetitions is only intended for quick visual evaluation of benchmark execution time, but is not sufficient for thorough experimental evaluation, which will generally need much more repetitions.
For thorough experimental evaluation, the benchmarks should be repeated for a large number of
times or executed for a long time. The number of repetitions and the execution time can be
set for all benchmarks using the -r
or -t
options. More fine-grained control over benchmark
execution can be achieved by providing the harness with a plugin implementing a custom execution
policy (see below for details).
The Renaissance Suite comes in two distributions, and is available under both the MIT license and the GPL3 license. The GPL distribution with all the benchmarks is licensed under the GPL3 license, while the MIT distribution includes only those benchmarks that themselves have less restrictive licenses.
Depending on your needs, you can use either of the two distributions.
The list below contains the licensing information (and JVM version requirements) for each benchmark.
The following is the complete list of benchmarks, separated into groups.
-
als
- Runs the ALS algorithm from the Spark ML library.
Default repetitions: 30; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
chi-square
- Runs the chi-square test from Spark MLlib.
Default repetitions: 60; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
dec-tree
- Runs the Random Forest algorithm from the Spark ML library.
Default repetitions: 40; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
gauss-mix
- Computes a Gaussian mixture model using expectation-maximization.
Default repetitions: 40; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
log-regression
- Runs the Logistic Regression algorithm from the Spark ML library.
Default repetitions: 20; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
movie-lens
- Recommends movies using the ALS algorithm.
Default repetitions: 20; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
naive-bayes
- Runs the multinomial Naive Bayes algorithm from the Spark ML library.
Default repetitions: 30; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
page-rank
- Runs a number of PageRank iterations, using RDDs.
Default repetitions: 20; APACHE2 license, MIT distribution; Supported JVM: 11 and later
-
akka-uct
- Runs the Unbalanced Cobwebbed Tree actor workload in Akka.
Default repetitions: 24; MIT license, MIT distribution; Supported JVM: 11 and later -
fj-kmeans
- Runs the K-Means algorithm using the fork/join framework.
Default repetitions: 30; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
reactors
- Runs benchmarks inspired by the Savina microbenchmark workloads in a sequence on Reactors.IO.
Default repetitions: 10; MIT license, MIT distribution; Supported JVM: 11 and later
-
db-shootout
- Executes a shootout test using several in-memory databases.
Default repetitions: 16; APACHE2 license, MIT distribution; Supported JVM: 11 - 18 -
neo4j-analytics
- Executes Neo4j graph queries against a movie database.
Default repetitions: 20; GPL3 license, GPL3 distribution; Supported JVM: 17 and later
-
future-genetic
- Runs a genetic algorithm using the Jenetics library and futures.
Default repetitions: 50; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
mnemonics
- Solves the phone mnemonics problem using JDK streams.
Default repetitions: 16; MIT license, MIT distribution; Supported JVM: 11 and later -
par-mnemonics
- Solves the phone mnemonics problem using parallel JDK streams.
Default repetitions: 16; MIT license, MIT distribution; Supported JVM: 11 and later -
rx-scrabble
- Solves the Scrabble puzzle using the Rx streams.
Default repetitions: 80; GPL2 license, GPL3 distribution; Supported JVM: 11 and later -
scrabble
- Solves the Scrabble puzzle using JDK Streams.
Default repetitions: 50; GPL2 license, GPL3 distribution; Supported JVM: 11 and later
-
dotty
- Runs the Dotty compiler on a set of source code files.
Default repetitions: 50; BSD3 license, MIT distribution; Supported JVM: 11 and later -
philosophers
- Solves a variant of the dining philosophers problem using ScalaSTM.
Default repetitions: 30; BSD3 license, MIT distribution; Supported JVM: 11 and later -
scala-doku
- Solves Sudoku Puzzles using Scala collections.
Default repetitions: 20; MIT license, MIT distribution; Supported JVM: 11 and later -
scala-kmeans
- Runs the K-Means algorithm using Scala collections.
Default repetitions: 50; MIT license, MIT distribution; Supported JVM: 11 and later -
scala-stm-bench7
- Runs the stmbench7 benchmark using ScalaSTM.
Default repetitions: 60; BSD3, GPL2 license, GPL3 distribution; Supported JVM: 11 and later
-
finagle-chirper
- Simulates a microblogging service using Twitter Finagle.
Default repetitions: 90; APACHE2 license, MIT distribution; Supported JVM: 11 and later -
finagle-http
- Sends many small Finagle HTTP requests to a Finagle HTTP server and awaits response.
Default repetitions: 12; APACHE2 license, MIT distribution; Supported JVM: 11 and later
The suite also contains a group of benchmarks intended solely for testing purposes:
-
dummy-empty
- A dummy benchmark which only serves to test the harness.
Default repetitions: 20; MIT license, MIT distribution; Supported JVM: 11 and later -
dummy-failing
- A dummy benchmark for testing the harness (fails during iteration).
Default repetitions: 20; MIT license, MIT distribution; Supported JVM: 11 and later -
dummy-param
- A dummy benchmark for testing the harness (test configurable parameters).
Default repetitions: 20; MIT license, MIT distribution; Supported JVM: 11 and later -
dummy-setup-failing
- A dummy benchmark for testing the harness (fails during setup).
Default repetitions: 20; MIT license, MIT distribution; Supported JVM: 11 and later -
dummy-teardown-failing
- A dummy benchmark for testing the harness (fails during teardown).
Default repetitions: 20; MIT license, MIT distribution; Supported JVM: 11 and later -
dummy-validation-failing
- A dummy benchmark for testing the harness (fails during validation).
Default repetitions: 20; MIT license, MIT distribution; Supported JVM: 11 and later
If you are using an external tool to inspect a benchmark, such as an instrumentation agent, or a profiler, then you may need to make this tool aware of when a benchmark's measured operation is about to be executed and when it finished executing.
If you need to collect additional metrics associated with the execution of the measured operation, e.g., hardware counters, you will need to be notified about operation execution, and you may want to store the measured values in the output files produced by the harness.
If you need the harness to produce output files in different format (other than CSV or JSON), you will need to be notified about values of metrics collected by the harness and other plugins.
If you need more fine-grained control over the repetition of the benchmark's measured operation, you will need to be able to tell the harness when to keep executing the benchmark and when to stop.
To this end, the suite provides hooks for plugins which can subscribe to events related to harness state and benchmark execution.
This repository contains two such plugins: one that uses a native agent built with
PAPI to collect information from hardware counters and
a plugin for collecting information from a
CompilationMXBean.
See their respective READMEs under the plugin
directory for more information.
If you wish to create your own plugin, please consult documentation/plugins.md for more details.
To make the harness use an external plugin, it needs to be specified on the command line.
The harness can load multiple plugins, and each must be enabled using the
--plugin <class-path>[!<class-name>]
option. The <class-path>
is the class path on which
to look for the plugin class (optionally, you may add <class-name>
to specify a fully
qualified name of the plugin class).
Custom execution policy must be enabled using the --policy <class-path>!<class-name>
option.
The syntax is the same as in case of normal plugins (and the policy is also a plugin, which
can register for all event types), but this option tells the harness to actually use the
plugin to control benchmark execution. Other than that, policy is treated the same way as a
plugin.
When registering plugins for pair events (harness init/shutdown, benchmark set up/tear down, operation set up/tear down), the plugins specified earlier will "wrap" plugins specified later. This means that for example plugins that want to collect additional measurements and need to invoked as close as possible to the measured operation need to be specified last. Note that this also applies to an external execution policy, which would be generally specified first, but any order is possible.
Plugins (and policies) can receive additional command line arguments. Each argument must be
given using the --with-arg <arg>
option, which appends <arg>
to the list of arguments for
the plugin (or policy) that was last mentioned on the command line. Whenever a --plugin
(or --policy
) option is encountered, the subsequent --with-arg
options will append
arguments to that plugin (or policy).
The following is a complete list of command-line options.
Renaissance Benchmark Suite, version 0.15.0
Usage: renaissance [options] [benchmark-specification]
-h, --help Prints this usage text.
-r, --repetitions <count>
Execute the measured operation a fixed number of times.
-t, --run-seconds <seconds>
Execute the measured operation for fixed time (wall-clock).
--operation-run-seconds <seconds>
Execute the measured operation for fixed accumulated operation time (wall-clock).
--policy <class-path>!<class-name>
Use policy plugin to control repetition of measured operation execution.
--plugin <class-path>[!<class-name>]
Load external plugin. Can appear multiple times to load different plugins.
--with-arg <value> Adds an argument to the plugin or policy specified last. Can appear multiple times.
--csv <csv-file> Output results as CSV to <csv-file>.
--json <json-file> Output results as JSON to <json-file>.
-c, --configuration <conf-name>
Use benchmark parameters from configuration <conf-name>.
-o, --override <name>=<value>
Override the value of a configuration parameter <name> to <value>.
--scratch-base <dir> Create scratch directories in <dir>. Defaults to current directory.
--keep-scratch Keep the scratch directories after VM exit. Defaults to deleting scratch directories.
--no-forced-gc Do not force garbage collection before each measured operation. Defaults to forced GC.
--no-jvm-check Do not check benchmark JVM version requirements (for execution or raw-list).
--list Print the names and descriptions of all benchmarks.
--raw-list Print the names of benchmarks compatible with this JVM (one per line).
--group-list Print the names of all benchmark groups (one per line).
--benchmark-metadata <path-or-uri>
Path or an URI pointing to a .properties file with benchmark metadata.
--standalone Run harness in standalone mode. Disables benchmark module loader.
benchmark-specification List of benchmarks (or groups) to execute (or 'all').
You can also build and run Renaissance with JMH. To build a JMH-enabled JAR, run:
$ tools/sbt/bin/sbt renaissanceJmhPackage
To run the benchmarks using JMH, you can execute the following java
command:
$ java -jar 'renaissance-jmh/target/renaissance-jmh-0.15.0.jar'
Please see the contribution guide for a description of the contribution process.
Apart from documentation embedded directly in the source code, further
information about design and internals of the suite can be found in the
documentation
folder of this project.
When you find a bug in the suite, when you want to propose a new benchmark or ask for help, please, open an Issue at the project page at GitHub.