2016-08-10 4 views
5

私はMavenプロジェクトに取り組んでおり、jmhを使用してコードをベンチマークしたいと考えています。プロジェクトにソースコード、単体テスト、ベンチマークが含まれるように整理したいと思います。別のグラデルプロジェクト(link参照)を作成せずに、コードをベンチマークする方法があると思われます。 Mavenでこれを行う方法はありますか?別のMavenプロジェクトを作成せずにjmhを使用してベンチマークを行う

答えて

7

短い回答ははいです。

あなたはそれを達成するためのプラグインのカップルを必要とする

+- src/ 
    +- main/java - sources 
    +- test/ 
     +- java  - test sources 
     +- perf  - benchmarks 

私は私のプロジェクトでは、このディレクトリレイアウトに出会った(しかし、あなたは間違いなくそれを変更することができます)。

  1. build-helper-maven-plugin

    カスタムテストソース場所付着する
<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-plugintest-compile
  • <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> 
    
    jmh-generator-annprocess注釈プロセッサを実行するために、
      1. maven-assembly-pluginはベンチマークその後
      <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> 
      

      を持つ実行可能なjarファイルを作成しますいつものように実行することができベンチマークで実行可能なjarファイルを取得します

      java -jar target/your-project-version-perf-tests.jar 
      

      作業例hereを見ることができます。

      NOTE

      は、このソリューションの唯一の欠点は、すべてのテストクラスとテストの依存関係も間違いなくそれをbloatsベンチマークとjarファイルに含まれることです。しかし、別の(${project.build.directory}/test-classes以外の)ディレクトリにベンチマークをコンパイルすることで回避できます。

    +0

    実際の例(ExampleBenchmark.javaのdoSomethingTest)では、forループを避ける方が良いでしょう。これは、JVMのループ最適化による意図しないパフォーマンス結果を招くためです。 –

    関連する問題