Releases: renaissance-benchmarks/renaissance
Renaissance 0.16.1
This is a maintenance release primarily aimed at improving compatibility with Java 26 (EA). Apart from minor changes to the non-timed parts of the als and db-shootout benchmarks, there have been no changes to benchmark code. Similarly, apart from patches to avoid accessing JDK internals removed in Java 26, there have been no dependency version updates. See below for details.
Java Compatibility
Early Java 26 builds removed an internal class which affected the Spark and db-shootout benchmarks. To make those benchmarks compatible with the upcoming Java release, we replace the offending classes in the problematic dependencies (Chronicle Core, Chronicle Map, Spark Unsafe, and Hadoop Client) with modified versions that avoid calling terminally deprecated and removed public APIs, or making reflective calls to internal classes.
- Patch Chronicle Core, Chronicle Map, Spark Unsafe, and Hadoop Client API to improve compatibility with Java 26+ (#481)
Workload Updates
In als, a validation failure was occurring on a many-core architecture where floating-point calculations resulted in a slightly different results than expected. The validation tolerance was increased to account for such minor platform-specific numerical discrepancies, and the tolerances were made configurable. In db-shootout, remote usage reporting in the Chronicle Analytics library was disabled to prevent the benchmark from sending analytics data to an external server.
- Bump validation tolerance for 'als' and expose it through parameters (#483)
- Disable remote reporting in Chronicle Analytics (#482)
Harness Updates
The CSV and JSON outputs produced by the harness now include the VM start time in nanoseconds (vm_start_ns), enabling better correlation with external monotonic clocks used by profilers (#468). The harness was also modified to load benchmark dependencies directly from the main bundle JAR instead of extracting them to a temporary directory. This change was primarily aimed at avoiding class-loading exceptions in shutdown hooks, observed particularly in the Apache Spark benchmarks (#471), but it also reduces write I/O on benchmark startup as a welcome side effect. A related change was focused on more robust clean up of the scratch directory (#464), especially when located on NFS. Finally, the suite documentation was updated to cover several known issues that require user intervention (#375, #464, #480).
Renaissance 0.16.0
This release brings improved benchmark validation, numerous platform and library updates, and improved compatibility with recent Java versions. Even though the source code of most benchmarks remains unchanged (apart from fixes and changes due to introducing validation in several benchmarks), the actual code executed at runtime may be affected by the dependency updates and exhibit changes in performance.
Workload validation
Validation of workload results ensures that changes in the underlying libraries or the JVM do not break the workloads. This release adds or improves validation in 7 workloads, bringing Renaissance closer to having fully validated workloads (there are 4 workloads left). In most cases, adding validation does not impact the reported benchmark performance, because it is performed outside the timed phase. However, in some cases, adding validation required changing the timed part of the benchmark, which is the case of the future-genetic and gauss-mix benchmarks (see the next section for a summary of changes with performance impact).
- Add validation to
fj-kmeansbenchmark (#431) - Add validation to
future-geneticbenchmark (#432) - Add validation to
alsbenchmark (#435) - Improve validation in
log-regressionbenchmark (#436) - Add validation to
movie-lensbenchmark (#441) - Add validation to
philosophersbenchmark (#446) - Improve validation in
gauss-mixvalidation (#448)
Workload changes (with impact on performance)
In some benchmarks, adding validation required changes to the benchmark code that impact performance. In the future-genetic benchmark, obtaining stable results for validation required associating random number generators with work items, not worker threads. This change eliminated work thread contention on a shared Random instance, leading to higher performance. In the gauss-mix benchmark, adding a more in-depth validation required training multiple models with reduced size and dimensionality of the input data.
In other cases, the benchmark code was modified to get a more reasonable behavior. In the philosophers benchmark, the rendering of system state snapshots (into string) was moved out of the transaction to avoid blocking the philosopher threads. In addition, the number of state snapshots was fixed to prevent the benchmark from performing variable amount of work. The movie-lens benchmark now loads input data directly from resource files, avoding unnecessary IO, but also uses Spark-provided methods to load CSV files to properly handle quoted values. This results in different partitioning defaults in subsequent computations, impacting performance.
- Avoid contention on shared
Randomin thefuture-geneticbenchmark (#432) - Train multiple models in the
gauss-mixbenchmark (#441) - Reduce contention and make the amount of work in the
philosophersbenchmark constant (#447) - Use Spark-provided methods to load CSV files and avoid extra IO in
movie-lens(#455)
Externally visible changes
The chromosome_count parameter name in the future-genetic benchmark has been renamed to population_size to better match what it really represents in the benchmark.
- Refactor parameter and variable names for clarity in the future-genetic benchmark (#463)
Java Compatibility
To improve compatibility with Java 23, the hadoop-client-api library used by the Apache Spark framework has been patched to avoid using the deprecated security manager API which prevented running on Java 23 without using the -Djava.security.manager=allow. The database libraries used in the db-shootout benchmark were updated to recent versions and, together with a fix to Chronicle initialization, the benchmark is now compatible with current Java releases.
- Patch Hadoop Client API jar to avoid deprecated Java Security API on Java 23 (#453)
- Update benchmark dependencies (#456)
- Set 'java.class.path' temporarily during Chronicle intialization (#459)
Dependency updates
The Scala 2.12 and 2.13 versions used by various benchmarks were updated to versions 2.12.20 and 2.13.15, respectively. The philosophers and scala-stm-bench7 benchmarks are now using Scala 3.3.4, together with the other benchmarks brought to Scala 3 in previous releases. This leaves only the reactors benchmark in the Scala 2.12 camp.
The following primary frameworks/libraries used by various benchmarks we updated:
apache-sparkbenchmarks now use Spark version 3.5.3twitter-finaglebenchmarks now use Finagle version 24.2.0neo4j-analyticsnow uses Neo4J version 5.25.1future-geneticnow uses Jenetics version 6.3.0rxnow uses RXJava3 version 3.1.9scala-dottynow uses Scala 3 compiler version 3.3.4scala-stmbenchmarks now use Scala STM version 0.11.1db-shootoutbenchmark now uses H2 MVStore version 2.3.232, MapDB
version 3.1.0, and Chronicle Map version 3.26ea4.
There are also numerous updates to the secondary/transitive dependencies such as Arrow, ASM, Caffeine, Guava, Jackson, Jersey, JNA, Netty, Parquet, and many others. See the relevant pull requests (especially #456) for details.
- Switch to external scala-stm and update to version 0.11.1 (#444)
- Migrate
scala-stmbenchmarks from Scala 2.12 to Scala 3 (#445) - Update benchmark dependencies (#456)
Build system and CI changes
- Update SBT to version 1.9.9 and drop SBT binaries (#450)
- Speed up CI by building Renaissance once and running it on multiple JDKs (#454)
Thanks
This release includes contributions from @lovisek, @BohdanQQ, @guilhas07, and @reneleonhardt in addition to @vhotspur and @lbulej. Many thanks!
Renaissance 0.15.0
This release is primarily aimed at improving compatibility with Java 21 (LTS) and Java 22 (EA), but it also marks the departure from Java 8 by requiring at least Java 11 to build the suite and to run the benchmarks. Several benchmarks now use Scala 3 and a memory leak was plugged in one of the benchmarks.
To improve compatibility with Java 21, the Apache Spark framework used by the apache-spark benchmarks was updated to version 3.5.0 and the Neo4j framework used by the neo4j-analytics benchmark was updated to version 5.12.0 (the benchmark now requires Java 17 to run). The database libraries used in the db-shootout benchmark were updated to more recent versions, which makes the benchmark compatible with Java 18 (while still far from Java 21, it is an improvement over Java 11, where the benchmark was stuck for some time).
The Scala 2.12 and 2.13 versions used by various benchmarks were updated to versions 2.12.18 and 2.13.12, respectively. The akka-uct, dotty, and scala-kmeans are now using Scala 3.3.1, and the neo4j-analytics benchmark now uses Scala 2.13. This leaves only the philosophers, reactors and stala-stm-bench7 benchmarks in the Scala 2.12 camp.
Even though the source code of most benchmarks remains unchanged (apart from bug fixes and changes due to library APIs), the actual code executed at runtime may be affected by the dependency updates.
Other changes include a fix for a memory leak in the reactors benchmark, and two fixes that improve compatibility with JMH.
The actual changes are spread over various pull requests, with the most important categorized below.
Dependency updates
- Update
apache-sparkbenchmarks to use Spark 3.5.0 (#399) and Hadoop 3.3.6 (#425)- Makes the
apache-sparkbenchmarks compatible with Java 21 (up from Java 20) - The Hadoop update improves compatibility with the (open) IBM Semeru OpenJ9-based JVM builds
- Makes the
- Update
rx-scrabblebenchmark to use RxJava 3.1.8 and migrate to rxjava3 API (#414) - Update
db-shootoutbenchmark to use H2 MVStore version 2.2.224, MapDB version 3.0.10, and Chronicle Map version 3.22.9 (#419, #412)- Makes the benchmark compatible with Java 18 (up from Java 11)
- Update
dottybenchmark to use scala3-compiler 3.3.1 and migrate to Scala 3.3 (#407) - Update
akka-uctbenchmark to use Akka Actors 2.6.32 and migrate to Scala 3.3 (#406) - Migrate
scala-stdlibbenchmarks to Scala 3.3 (#405) - Update
twitter-finaglebenchmarks to use Finagle 22.12.0 (#404) - Update
neo4j-analyticsbenchmark to use Neo4j 5.12.0 and migrate to Scala 2.13 (#419, #422)- Makes the benchmark compatible with Java 21 (up from Java 15, but requires at least Java 17)
- Update Scala 2 benchmarks to use Scala 2.12.18 and 2.13.12 (#411)
- Update various shared dependencies (#409, #419, #423)
- Most notably JNA 5.13.0, Netty 4.1.99, Guava 32.1.2-jre, ASM 9.6, Eclipse Collections 11.1.0, Jackson 2.15.2, and Jersey 2.40
Workload changes/fixes
- Prevent memory leaks in
reactorsbenchmark (#389) - Ensure that forked tasks get executed by threads from the fork-join pool in
fj-kmeans(#420) - Ensure that JMH invokes benchmark methods with correct context class loader (#421)
Build system and CI changes
Renaissance 0.14.2
This is a maintenance release featuring minor updates to the underlying libraries to achieve the following two goals:
- Avoid packaging vulnerable versions of the
log4jframework. Even though we believe that the Renaissance suite itself (and the way it is used) is not susceptible to the vulnerabilities, the presence of JAR files with vulnerable classes can trigger alarms from various security scanners in some environments. (#366, #367) - Improve compatibility with some processor architectures (loongarch64) by using an updated version of the JNA library. (#371)
There have been no changes to the benchmark code.
See also the release announcement.
Renaissance 0.14.1
This release fixes race conditions that were discovered in the finagle-chirper and reactors benchmarks:
finagle-chirper: avoid using iterator that can be modified during iteration (#356, #357)reactors: avoid incorrect usage of partially-initialized objects (#360)
Apart from the bug fixes, there have been no other changes to the benchmark code or the underlying libraries.
See also the release announcement.
Renaissance 0.14.0
This release contains internal cleanups and benchmark dependency updates to improve compatibility and to support execution of benchmarks using a single classloader, which makes the runtime less convoluted when using the benchmark in ahead-of-time compilation scenarios.
The source code of the benchmarks remains unchanged, but several dependencies were updated, potentially affecting the code executed by the benchmarks at runtime. The most significant change is the update of Apache Spark to version 3.2.0 and the associated migration of the apache-spark benchmarks from Scala 2.12 to Scala 2.13.
See also the release announcement.
The actual changes are spread roughly over 15 pull requests, with the most important categorized below.
Workload changes
- Update
apache-sparkbenchmarks to use Spark 3.2.0 and Scala 2.13 (#327) - Update Scala 2.13 benchmarks to use Scala 2.13.8 (#344)
- Update
akka-uctbenchmark to use Akka Actors 2.6.18 (#344) - Update
twitter-finaglebenchmarks to use Finagle 21.12.0 (#344) - Update
neo4j-analyticsbenchmark to use Neo4j 4.4.2 (#344) - Update
future-geneticbenchmark to use Jenetics 5.2.0 (#342) - Update
rx-scrabblebenchmark to use RX Java 1.3.8 (#342) - Update
dottybenchmark to use Scala3 compiler 3.0.2 (#342) - Update and commonize various dependencies (#342, #344)
- Use common JNA version (5.10.0) to support more architectures and fix architecture mapping on SAP JVM, resolving issues with
db-shootouton non-Intel architectures. - Use common Netty version (4.1.72) to avoid bundling several different versions and avoid component version mismatch in standalone (single classloader) benchmark execution.
- Use common versions of several other components (see PR for details).
- Use common JNA version (5.10.0) to support more architectures and fix architecture mapping on SAP JVM, resolving issues with
Workload fixes
- Expand 'Add-Opens' to prevent use of 'NilJvm' interface in Finagle (#330)
Harness changes
- Add
--benchmark-metadataCLI option to override the location benchmark metadata (#341) - Add
--standaloneCLI option to disable module loading (#341) - Add
Renaissance-Use-Modulesmanifest attribute to disable module loading (#341) - Add plugin for collecting basic memory information (#335)
- Tolerate missing implementation of JMX system info methods (#302)
Build system and CI changes
- Update SBT to version 1.6.1 and JMH to version 1.34 (#344)
- Generate metadata-only jars that allow running benchmarks with a single class loader (#341)
- Include
renaissance-harnesspackage for both Scala 2.12 and Scala 2.13.
- Include
- Refactor SBT project definition to speed up compilation and packaging (#336)
- Compile benchmarks in parallel, avoid bundling duplicated jars, avoid extra filesystem copies.
- Use JMH directly when generating benchmark JMH wrappers.
- Split testing into multiple workflows, keeping the important platforms in the
mainworkflow (#325)
Renaissance 0.13.0
This release is primarily a JDK compatibility update, introducing support for JDK17. As a result, this version of the Renaissance suite supports JDK8, JDK11, and JDK17 on Linux, MacOS X, and Windows (on x86_64 architectures).
The changes in this release are minimal. The most important one (#297) just brings Scala 2.12 benchmarks to Scala 2.12.15, which now properly supports JDK17 and we just pass these improvements on. No benchmark code has been changed, only project documentation (#294) and parts of the harness responsible for plugin loading (#292, #293).
See also the release announcement.
Renaissance 0.12.0
Apart from a number of internal cleanups, this release focuses on improving compatibility with modern platforms, and on moving away from Scala 2.11 and Spark 2 towards Scala 2.12, Scala 2.13, and Spark 3. Please see the release announcement for a high-level overview and more details.
The changes in this release are spread over more than 30 pull requests, some of which were fairly extensive. Because it is difficult to neatly attribute individual changes to individual PRs, we only list some of the more important PRs for reference.
Workload changes
- Update benchmarks to use Scala 2.12 or 2.13 (#242)
- Clean up apache-spark benchmarks (#248)
- Update
scala-dottyto usescalapsources and do hash-based validation (#263) - Remove executor control and explicit repartitioning (and few other cleanups) (#274)
- Set benchmark-specific thread limits for the Spark local executor (#284)
Harness changes
- Remove old temporary directory API from benchmark context (#246)
- Allow overriding benchmark parameters (#262)
Build system and CI changes
Renaissance 0.11.0
Workload changes:
- Avoid unnecessary I/O in
page-rank(#197) - Avoid creating response handlers per request in
finagle-http(#215) - Fix RDD caching issues and add checks in Spark workloads (#228)
- Fix resource path issues in
finagle-chirperon Windows (#222) - Fix classpath issues in
dottyon Windows (#183) - Update the Neo4J benchmark (#224)
Harness changes:
- Use single shot time mode in JMH wrappers (#185)
- Hardcode locale to improve output stability (#198)
- Force GC between iterations by default (#196)
- Add hardware counter collection plugin (#195)
- Add compilation time collection plugin (#218)
- Support named benchmark configurations (#191)
- Support benchmark parameters (#182)
- Record benchmark failure in JSON (#178)
- Record revision information in JSON (#177)
- Do not include dummy benchmarks in CLI list (#229)
- Add environment information to JSON (#216)
Renaissance 0.10.0
The following changes are part of the Renaissance release 0.10.0 :
- Introduced the
scala-dokubenchmark, a Sudoku solver written in Scala (#173 ) - Increased parallelism of
finagle-http(#149, #148 ) finagle-httpandfinagle-chirperbug fixes (#161, #164 )- Fixed parallelism of
movie-lensandalsto 4 executor threads to prevent contention (#145 ) - Provide support for bundling a JMH jar (#120 )
- Support of JDK8 and JDK11 (#73, #127 )
- Support PowerPC infrastructure (#153 )