From 3c77da7cfb06444de1f21d331f111f0f5a864756 Mon Sep 17 00:00:00 2001 From: emasliukovas <@emasliukovas> Date: Fri, 18 Dec 2020 14:21:22 +0200 Subject: [PATCH] Documentation update --- README.md | 98 ++++++++++++++++++++++------------------ docs/images/image19.png | Bin 8257 -> 18996 bytes 2 files changed, 53 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 8da97b33..1c108923 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,15 @@ **Prerequisites** -* Package `CybenchTools.zip` is built and tested using (on lower JAVA or Eclipse version it won’t work) - * JAVA – JDK-14.0.2, +* Package `CybenchTools.zip` is built and tested using + * JAVA – JDK-11.0.9, * Eclipse Version: 2020-09 (4.17.0). * Package `CyBenchToolsForEclipseMars.zip` is built and tested using * JAVA – JDK-1.8.0_201, * Eclipse Version: Eclipse Mars 2 (4.5.2). + +**Note:** on lower JAVA or Eclipse versions the plugin will not work. ### Installation from local file system @@ -30,11 +32,11 @@ Installation process for both version of plugins is the same: ![](./docs/images/image1.png) * Click button "Add". -* In installation dialog window deselect check box “Group items by category”, then list of features shall appear in the table. +* Then list of categories/features shall appear in the table. ![](./docs/images/image2.png) -* Check “CyBench” entry in the features table. +* Check “CyBench” entry in the table. * Click button “Next”. * Installation details window appears. Click button “Next”. * Licenses review window appears, review and select “I accept the terms of the license agreement”, click button “Finish”. @@ -53,22 +55,6 @@ Installation process for both version of plugins is the same: ![](./docs/images/image6.png) - -## Uninstall - -* Applicable if CyBench tools were used in developer mode: - * Stop the Eclipse. - * Navigate to drop ins directory of the Eclipse IDE (for example: `c:\eclipses\eclipse-2020-09-R\dropins\`). - * Delete files which contains word `cybench` in their file name. - * Start Eclipse again. -* Applicable if CyBench tools were installed using update site package: - * Select Eclipse menu Help→ About Eclipse IDE → Click Installation Details. - * In the `Installed Software` tab select table item which has name `CyBench` - * Click button `Uninstall`. - * Restart Eclipse when requested. - -![](./docs/images/image7.png) - ## Usage Instructions ### Project nature “CyBench Nature” @@ -104,29 +90,6 @@ This configuration triggers, any JMH benchmarks implementing class recompile and Configuration allows to run CyBench launcher without any other specific rebuild and this does not depend on project nature. Also this allows to use JMH framework in Eclipse for generic Eclipse JAVA project without Maven usage. -## CyBench Explorer View - -View displays all CyBench reports found in the workspace projects. -* To open this view navigate “Window”→”Show View” → “Other” → “CyBench Tools” → “CyBench Explorer”. If Java perspective is active then it opens on the right side of the screen otherwise opens at the bottom, and can place it anywhere. - -![](./docs/images/image12.png) - -* Double click with mouse on the report entry and it will open a view with report details. - -![](./docs/images/image13.png) - -## Report Details View - -View displays selected or generated during launch report details. -* Displays a list of benchmark tests on the right. -* View open position is at the bottom of the screen, either when report is selected via “CyBench Explorer” or after launch benchmarks using “CyBench launcher” - -![](./docs/images/image14.png) - -* Double click mouse on “Available Benchmarks” entries on the left size of the view and it will display selected benchmark details in the right sideof the view, tab “Benchmark Details”. -* Also can navigate thorough other report attributes by clicking on the appropriate “tab” - “Summary”, “JVM Properties”, “HW Properties”. -* Chrome icon at the top-right view side allows to open the report using default system Web browser (which is defined in Eclipse settings) i.e. navigate to CyBench website to particular report details page (if the report was sent to CyBench Repository). - ## Generate Benchmarks Feature generates benchmark class stubs, adds necessary annotations and methods for a selected JAVA file. @@ -144,7 +107,10 @@ Feature generates benchmark class stubs, adds necessary annotations and methods ![](./docs/images/image15.png) -* A popup will be displayed that shows all the available public methods inside the class. Check the checkboxes on the right side to select the methods for which to generate the benchmark methods. +* A popup will be displayed that shows all the available public methods inside the class. +* Check the checkboxes on the right side to select the methods for which to generate the benchmark methods. +* Select the benchmarking mode from the dropdown list. + **Notice**: If the file have been already generated previously and still exists its contents will not be overwritten. ![](./docs/images/image19.png) @@ -166,7 +132,7 @@ Launches all JMH benchmarks which are found under selected JAVA file. Quick laun **Steps:** -* Right click on the JAVA file or project which contains JMH Benchmarks. +* Right click on the JAVA file or project (quick launch projects does not work in java perspective) which contains JMH Benchmarks. * Select “Run As”→ “Run on CyBench”. ![](./docs/images/image17.png) @@ -200,7 +166,49 @@ Launch configuration view which allows to create a custom launch settings for a * report is displayed under “Report Details View”, * report entry appears in “CyBench Explorer”. + +## CyBench Explorer View + +View displays all CyBench reports found in the workspace projects. +* To open this view navigate “Window”→”Show View” → “Other” → “CyBench Tools” → “CyBench Explorer”. If Java perspective is active then it opens on the right side of the screen otherwise opens at the bottom, and can place it anywhere. + +![](./docs/images/image12.png) + +* Double click with mouse on the report entry and it will open a view with report details. + +![](./docs/images/image13.png) + +## Report Details View + +View displays selected or generated during launch report details. +* Displays a list of benchmark tests on the right. +* View open position is at the bottom of the screen, either when report is selected via “CyBench Explorer” or after launch benchmarks using “CyBench launcher” + +![](./docs/images/image14.png) + +* Double click mouse on “Available Benchmarks” entries on the left size of the view and it will display selected benchmark details in the right sideof the view, tab “Benchmark Details”. +* Also can navigate thorough other report attributes by clicking on the appropriate “tab” - “Summary”, “JVM Properties”, “HW Properties”. +* Chrome icon at the top-right view side allows to open the report using default system Web browser (which is defined in Eclipse settings) i.e. navigate to CyBench website to particular report details page (if the report was sent to CyBench Repository). + ## Logging Plugin logs message to Eclipse default log file which is located in `\.metadata\.plugins\org.eclipse.ui.workbench\log` or `\.metadata\.log`. Log messages are also displayed in `Error Log` view, which is accessible via `Menu bar → Window → Show View → Error Log` + +## Uninstall + +* Applicable if CyBench tools were installed using update site package: + * Select Eclipse menu Help→ About Eclipse IDE → Click Installation Details. + * In the `Installed Software` tab select table item which has name `CyBench` + * Click button `Uninstall`. + * Restart Eclipse when requested. + +![](./docs/images/image7.png) + + +## More information on benchmarking your code +* [CyBench Benchmark samples](https://github.com/K2NIO/gocypher-cybench-java-core/tree/main/gocypher-cybench-jvm/src/main/java/com/gocypher/cybench/jmh/jvm/client/tests) +* [Avoiding Benchmarking Pitfalls on the JVM](https://www.oracle.com/technical-resources/articles/java/architect-benchmarking.html#:~:text=JMH%20is%20a%20Java%20harness,to%20unwanted%20virtual%20machine%20optimizations) +* [JMH - Java Microbenchmark Harness](http://tutorials.jenkov.com/java-performance/jmh.html) +* [Java Benchmarks with JMH](https://medium.com/swlh/java-benchmarks-with-jmh-a-preamble-285510a77dd2) +* [Microbenchmarking with Java](https://www.baeldung.com/java-microbenchmark-harness) \ No newline at end of file diff --git a/docs/images/image19.png b/docs/images/image19.png index 503084eca0aa8337d5f638f5af1041534cbf3777..4ed0ef4db3ed595fdaace33f8ede4e0e10ef97b4 100644 GIT binary patch literal 18996 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