Pracuję nad projektem Maven i życzę, aby skorzystać JMH do benchmarku mojego kodu. Chcę zorganizować mój projekt tak, aby zawierał kod źródłowy, testy jednostkowe i testy porównawcze. Wydaje się, że sposób w Gradle do benchmarku kod bez tworzenia odrębnego projektu Gradle (patrz link). Czy istnieje sposób, aby to zrobić w Maven?Korzystanie JMH do kodu wzorcowego bez tworzenia oddzielnego projektu maven
5
A
Odpowiedz
7
Krótka odpowiedź jest tak.
natknąłem się na ten układ katalogów w moich projektów (ale na pewno można go zmienić)
+- src/
+- main/java - sources
+- test/
+- java - test sources
+- perf - benchmarks
Trzeba kilka wtyczek do osiągnięcia tego.
build-helper-maven-plugin
dołączyć zwyczaj źródła badań lokalizacji
<execution>
<id>add-test-source</id>
<phase>generate-test-sources</phase>
<goals>
<goal>add-test-source</goal>
</goals>
<configuration>
<sources>
<source>src/test/perf</source>
</sources>
</configuration>
</execution>
maven-compiler-plugin
uruchomićjmh-generator-annprocess
adnotacji procesora natest-compile
fazy
<execution>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</execution>
maven-assembly-plugin
stworzyć runnable słoik z benchmarków
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<attach>true</attach>
<archive>
<manifest>
<mainClass>org.openjdk.jmh.Main</mainClass>
</manifest>
</archive>
</configuration>
</execution>
<assembly>
<id>perf-tests</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>test</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.directory}/test-classes</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>**/*</include>
</includes>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
</fileSets>
</assembly>
Po tym dostaniesz wykonywalnego słoik z wzorców, które mogą być uruchamiane jako zwykły
java -jar target/your-project-version-perf-tests.jar
Możesz zobaczyć działający przykład: here.
UWAGA
Jedyną wadą tego rozwiązania jest to, że wszystkie klasy badań i zależności badań będą również zawarte w słoiku z benchmarków, które zdecydowanie bloats go. Ale można tego uniknąć poprzez opracowywanie założeń w oddzielne (inne niż ${project.build.directory}/test-classes
) katalogu.
W przykładzie roboczym (tj doSomethingTest w ExampleBenchmark.java), to lepiej, aby uniknąć pętli for, ponieważ prowadzi do niezamierzonych rezultatów ze względu na optymalizację wydajności pętli w JVM. –