JUnit testlerini kullanarak mevcut projemde JMH kriterlerini nasıl çalıştırabilirim? Resmi belgeler Maven gölge eklentisini kullanarak ayrı bir proje oluşturmayı ve main
yönteminin içinde JMH'yi başlatmanızı önerir. Bu gerekli mi ve neden tavsiye edilir?JUnit testlerinin içinden JMH nasıl çalıştırılır?
cevap
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 hangiRunResult
nesneleri döndürür vb
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. –
@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ı? –
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. –