| ProtonJ2 JMH Benchmarks |
| ------- |
| This module contains optional [JMH](http://openjdk.java.net/projects/code-tools/jmh/) performance tests designed |
| to stress performance critical parts of the proton engine (eg encoders, decoders). |
| |
| Note that this module is an optional part of the overall project build and does not deploy anything, due to its use |
| of JMH which is not permissively licensed. The module must either be built directly, or enabled |
| within the overall build by using the 'performance-jmh' maven profile. |
| |
| Building the benchmarks |
| ------- |
| |
| The benchmarks are maven built and involve some code generation for the JMH part. As such it is required that you |
| rebuild upon changing the code. As the codebase is small it is recommended that you do this from the project |
| root folder to avoid missing any changes from other modules. |
| |
| As noted above this module is optional in the main build, enabled by the performance-jmh profile, so to enable it |
| a command such as the following can be used from the root folder: |
| |
| mvn clean install -Pperformance-jmh |
| |
| Running the benchmarks: General |
| ------- |
| It is recommended that you consider some basic benchmarking practices before running benchmarks: |
| |
| 1. Use a quiet machine with enough CPUs to run the number of threads you mean to run. |
| 2. Set the CPU freq to avoid variance due to turbo boost/heating. |
| 3. Use an OS tool such as taskset to pin the threads in the topology you mean to measure. |
| |
| Running the JMH Benchmarks |
| ----- |
| To run all JMH benchmarks: |
| |
| java -jar target/protonj2-performance-tests.jar -f <number-of-forks> -wi <number-of-warmup-iterations> -i <number-of-iterations> |
| To list available benchmarks: |
| |
| java -jar target/protonj2-performance-tests.jar -l |
| Some JMH help: |
| |
| java -jar target/protonj2-performance-tests.jar -h |
| |
| Example |
| ----- |
| To run a benchmark on the String decoding while saving the results in json format: |
| |
| java -jar target/protonj2-performance-tests.jar StringsBenchmark.decode* -f 1 -wi 5 -i 5 -rf json -rff strings_decode_before.json -gc true |
| |
| After changing something in the String decode path and building the whole project again, |
| another snapshot of the current state of performance for the same case can be taken: |
| |
| java -jar target/protonj2-performance-tests.jar StringsBenchmark.decode* -f 1 -wi 5 -i 5 -rf json -rff strings_decode_after.json -gc true |
| |
| then it is possible to use many graphical tools to compare the results: one is [JMH Visualizer](http://jmh.morethan.io/). |