2016-08-10 23 views
5

Tôi đang làm việc trên dự án Maven và tôi muốn sử dụng jmh để chuẩn mã của mình. Tôi muốn tổ chức dự án của mình để nó chứa mã nguồn, kiểm tra đơn vị và điểm chuẩn. Dường như có một cách để chấm điểm chuẩn mã của bạn mà không cần tạo một dự án gradle riêng biệt (xem link). Có cách nào để làm điều này trong Maven không?Sử dụng jmh để mã điểm chuẩn mà không cần tạo dự án maven riêng lẻ

Trả lời

7

Câu trả lời ngắn gọn là .

tôi đi qua để bố trí thư mục này trong các dự án của tôi (nhưng bạn chắc chắn có thể thay đổi nó)

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

Bạn cần một vài plugin để đạt được điều đó.

  1. build-helper-maven-plugin để đính kèm tùy chỉnh nguồn kiểm tra vị trí
<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> 
  1. maven-compiler-plugin để chạy jmh-generator-annprocess xử lý chú thích trên test-compile giai đoạn
<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> 
  1. maven-assembly-plugin để tạo jar Runnable với tiêu chuẩn
<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> 

Sau đó bạn sẽ nhận được một jar thực thi với tiêu chuẩn có thể được chạy như bình thường

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

Bạn có thể xem ví dụ làm việc here.

LƯU Ý

Hạn chế duy nhất của giải pháp này là tất cả các lớp học thử nghiệm và phụ thuộc kiểm tra cũng sẽ được đưa vào jar với tiêu chuẩn mà chắc chắn bloats nó lên. Nhưng bạn có thể tránh nó bằng cách biên dịch điểm chuẩn trong thư mục riêng biệt (khác với ${project.build.directory}/test-classes).

+0

Trong ví dụ làm việc của bạn (ví dụ: doSomethingTest trong ExampleBenchmark.java), tốt hơn là tránh vòng lặp for, vì nó dẫn đến kết quả hiệu suất không mong muốn do tối ưu hóa vòng lặp trong JVM. –

Các vấn đề liên quan