2015-05-27 20 views

Odpowiedz

44

Używam JMH wewnątrz mojego istniejącego projektu Maven przy użyciu JUnit bez widocznych złych efektów. Nie mogę odpowiedzieć, dlaczego autorzy zalecają robienie różnych rzeczy. Nie zaobserwowałem różnicy w wynikach. JMH uruchamia oddzielną wirtualną maszynę wirtualną, aby uruchamiać testy porównawcze w celu ich izolowania. Oto co mam zrobić:

  • Dodaj zależności JMH do POM:

    <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> 
    

    Zauważ, że umieściłem je w zakresie test.

    W środowisku Eclipse konieczne może być ręczne skonfigurowanie procesora adnotacji. NetBeans obsługuje to automatycznie.

  • Utwórz klasę JUnit i JMH. Zdecydowałem się połączyć obie w jedną klasę, ale to zależy od ciebie. Zauważ, że to, co faktycznie określa, które testy będą uruchamiane z twojego testu JUnit, to OptionsBuilder.include!

    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)); 
         } 
    } 
    
  • procesor adnotacji JMH wydaje się nie działać dobrze z kompilacji na zapisywanie w NetBeans. Podczas modyfikowania testów wydajności może być konieczne wykonanie pełnej wersji Clean and Build. (Wszelkie sugestie docenione!)

  • Przeprowadź test launchBenchmark i obejrzyj wyniki!

    ------------------------------------------------------- 
    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 nawet zwraca RunResult obiektów, na których można zrobić twierdzeń itd

+1

Nie jest to opcja zalecana uruchomić testy pod JMH. Testy jednostkowe i inne IDE kolidują z pomiarami. Zrób to bezpośrednio z linii poleceń. –

+0

@IvanVoroshilin Próbowałem to w obie strony i nie widziałem różnicy w wynikach. Czy masz konkretne porady, w jakich warunkach to staje się problemem? –

+1

Wyniki są mniej wiarygodne, to tylko zalecenie. Wyeliminuj czynniki zewnętrzne. To przeszkadza, jeśli chodzi o mikrobezpieczenie. –

Powiązane problemy