| [//]: # " Copyright (c) 2015, 2018 Oracle and/or its affiliates. All rights reserved. " | 
 | [//]: # " " | 
 | [//]: # " This program and the accompanying materials are made available under the " | 
 | [//]: # " terms of the Eclipse Distribution License v. 1.0, which is available at " | 
 | [//]: # " http://www.eclipse.org/org/documents/edl-v10.php. " | 
 | [//]: # " " | 
 | [//]: # " SPDX-License-Identifier: BSD-3-Clause " | 
 |  | 
 | Hello World JMH Example | 
 | ======================= | 
 |  | 
 | ### *How to write JAX-RS Micro-Benchmarks* | 
 |  | 
 | This example demonstrates how to write simple micro-benchmarks, based on | 
 | JMH, for JAX-RS application. This particular example shows how to obtain | 
 | throughput of a simple 'Hello World' application. | 
 |  | 
 | The application consists of one resource, `HelloWorldResource` with | 
 | three resource methods (one method per HTTP GET, POST and PUT methods). | 
 | To make it more interesting the resource also acts like sub-resource | 
 | locator which allows us to measure the difference between processing of | 
 | normal resource methods and sub-resource locators. | 
 |  | 
 | This application is solely focused on showing how to write benchmarks | 
 | and it doesn't start any server that would allow one to send request to | 
 | the `HelloWorldResource`. | 
 |  | 
 | Main class that illustrates writing benchmarks for JAX-RS applications | 
 | is `HelloWorldBenchmark`. Measurements are not based on any container | 
 | such as Servlet or Grizzly container. Requests are directly invoked on | 
 | `ApplicationHandler` class from Jersey Server module to eliminate any | 
 | network influences. Still, all JAX-RS features, like filters and | 
 | interceptors, are taken into consideration when the benchmark is | 
 | executed. | 
 |  | 
 | It's also possible to run the benchmark on older versions of Jersey, | 
 | e.g. 2.15, which had known performance issues with sub-resource | 
 | locators. The recommended approach is to run the benchmarks without any | 
 | changes at first and then modify the `pom.xml` to switch version of | 
 | Jersey to 2.15 and run the benchmarks again to see the (big) difference. | 
 | Look for `jersey-bom` artifact in `pom.xml` to see how the switch should | 
 | be done. | 
 |  | 
 | Sample Results | 
 | -------------- | 
 |  | 
 | The execution takes around 2 minutes and you can see partial results | 
 | (for each combination of parameters) of every iteration. At the end JMH | 
 | gives you whole summary. For example, Jersey 2.16 gives the following | 
 | results: | 
 |  | 
 |     # Run complete. Total time: 00:01:41 | 
 |  | 
 |     Benchmark                    (method)              (path)   Mode  Cnt      Score      Error  Units | 
 |     HelloWorldBenchmark.measure       GET          helloworld  thrpt    8  74343.864 ± 4814.979  ops/s | 
 |     HelloWorldBenchmark.measure       GET  helloworld/locator  thrpt    8  54137.102 ± 8996.766  ops/s | 
 |     HelloWorldBenchmark.measure      POST          helloworld  thrpt    8  45173.853 ± 5349.363  ops/s | 
 |     HelloWorldBenchmark.measure      POST  helloworld/locator  thrpt    8  37144.797 ± 4699.782  ops/s | 
 |     HelloWorldBenchmark.measure       PUT          helloworld  thrpt    8  45945.974 ± 4116.752  ops/s | 
 |     HelloWorldBenchmark.measure       PUT  helloworld/locator  thrpt    8  36345.667 ± 5929.480  ops/s | 
 |  | 
 | Running the Example | 
 | ------------------- | 
 |  | 
 | There are two ways how to run the micro-benchmark. Either via Maven | 
 | `exec:exec` | 
 |  | 
 | >     mvn clean install exec:exec | 
 |  | 
 | or you can build the benchmark JAR at first | 
 |  | 
 | >     mvn clean install | 
 |  | 
 | and then invoking it using `java` command | 
 |  | 
 | >     java -jar target/benchmark.jar | 
 |  | 
 | Resources | 
 | --------- | 
 |  | 
 | JMH has excellent overview of it's features presented as list of | 
 | different samples. You can find them on [JMH | 
 | Samples](http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/). | 
 | The general overview of JMH is available at their [home | 
 | page](http://openjdk.java.net/projects/code-tools/jmh/). |