2015-05-27 19 views

cevap

44

JUnit kullanarak mevcut Maven projemin içinde JMH'yi hiç bir yan etkisi olmayan bir şekilde çalıştırıyorum. Yazarların neden farklı şeyler yapmayı önerdiklerini cevaplayamıyorum. Sonuçlarda bir fark gözlemlemedim. JMH, ayrı ayrı bir JVM'yi ayırmak için karşılaştırma ölçütlerini çalıştırır. İşte benim yaptığım:

  • POM için JMH bağımlılıkları ekleyin: Ben kapsam test yerleştirdi ettik

    <dependency> 
        <groupId>org.openjdk.jmh</groupId> 
        <artifactId>jmh-core</artifactId> 
        <version>1.9.3</version> 
        <scope>test</scope> 
    </dependency> 
    <dependency> 
        <groupId>org.openjdk.jmh</groupId> 
        <artifactId>jmh-generator-annprocess</artifactId> 
        <version>1.9.3</version> 
        <scope>test</scope> 
    </dependency> 
    

    Not.

    Eclipse'de ek not işlemcisini el ile yapılandırmanız gerekebilir. NetBeans bunu otomatik olarak işler.

  • JUnit ve JMH sınıfınızı oluşturun. Her ikisini de tek bir sınıfa dahil etmeyi seçtim ama bu size kalmış. JUnit testinizden hangi benchmarkların çalıştırılacağını gerçekten belirleyen OptionsBuilder.include olduğuna dikkat edin!

    public class TestBenchmark { 
    
         @Test public void 
        launchBenchmark() throws Exception { 
    
          Options opt = new OptionsBuilder() 
            // Specify which benchmarks to run. 
            // You can be more specific if you'd like to run only one benchmark per test. 
            .include(this.getClass().getName() + ".*") 
            // Set the following options as needed 
            .mode (Mode.AverageTime) 
            .timeUnit(TimeUnit.MICROSECONDS) 
            .warmupTime(TimeValue.seconds(1)) 
            .warmupIterations(2) 
            .measurementTime(TimeValue.seconds(1)) 
            .measurementIterations(2) 
            .threads(2) 
            .forks(1) 
            .shouldFailOnError(true) 
            .shouldDoGC(true) 
            //.jvmArgs("-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintInlining") 
            //.addProfiler(WinPerfAsmProfiler.class) 
            .build(); 
    
          new Runner(opt).run(); 
         } 
    
        // The JMH samples are the best documentation for how to use it 
        // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/ 
        @State (Scope.Thread) 
        public static class BenchmarkState 
        { 
         List<Integer> list; 
    
          @Setup (Level.Trial) public void 
         initialize() { 
    
           Random rand = new Random(); 
    
           list = new ArrayList<>(); 
           for (int i : LoopUtils.range (1000)) 
            list.add (rand.nextInt()); 
          } 
        } 
    
         @Benchmark public void 
        benchmark1 (BenchmarkState state, Blackhole bh) { 
    
          List<Integer> list = state.list; 
    
          for (int i = 0; i < 1000; i++) 
           bh.consume (list.get (i)); 
         } 
    } 
    
  • JMH ek açıklama işlemci ile iyi çalışmaz gibi görünüyor derleme-on-tasarruf NetBeans. Karşılaştırmaları her değiştirdiğinizde tam bir Clean and Build yapmalısınız. (Herhangi bir öneri takdir edildi!)

  • launchBenchmark testinizi yapın ve sonuçları izleyin!

    ------------------------------------------------------- 
    T E S T S 
    ------------------------------------------------------- 
    Running net.almson.util.TestBenchmark 
    # JMH 1.9.3 (released 12 days ago) 
    # VM invoker: C:\Program Files\Java\jdk1.8.0_45\jre\bin\java.exe 
    # VM options: <none> 
    # Warmup: 2 iterations, 1 s each 
    # Measurement: 2 iterations, 1 s each 
    # Timeout: 10 min per iteration 
    # Threads: 2 threads, will synchronize iterations 
    # Benchmark mode: Average time, time/op 
    # Benchmark: net.almson.util.TestBenchmark.benchmark1 
    
    # Run progress: 0.00% complete, ETA 00:00:04 
    # Fork: 1 of 1 
    # Warmup Iteration 1: 2.984 us/op 
    # Warmup Iteration 2: 3.007 us/op 
    Iteration 1: 2.844 us/op 
    Iteration 2: 2.832 us/op 
    
    
    Result "benchmark1": 
        2.838 us/op 
    
    
    # Run complete. Total time: 00:00:05 
    
    Benchmark     Mode Cnt Score Error Units 
    TestBenchmark.benchmark1 avgt 2 2.838   us/op 
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.255 sec 
    
    Results : 
    
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 
    
  • Runner.run hatta iddialarını yapabilirsiniz hangi RunResult nesneleri döndürür vb

+1

Bu değil JMH altında testler için önerilen bir seçenek. Birim testleri ve diğer IDE ölçümleri engeller. Komut satırından doğru yap. –

+0

@IvanVoroshilin Her iki yolu da denedim ve sonuçlarda bir fark görmedim. Bunun hangi problemler altında gerçekleştiğine dair somut tavsiye var mı? –

+1

Sonuçlar daha az güvenilir, sadece bir öneri. Dış faktörleri ortadan kaldırın. Bu, mikro-markalama söz konusu olduğunda ortaya çıkıyor. –