2017-01-03 13 views
2

私はJMHを使用してベンチマークしたいアプリケーションを持っています。この統合の参考資料は有用です。JMHベンチマークスプリングブートアプリケーション

+0

IMHO 'jmh'は、ベンチマークアプリケーションには適していませんが、特定のメソッドのみに適しています。 –

+1

私は春のMVCアプリケーションのためのbechmarkingを行うために管理しました。彼らはSpringブートアプリケーションのためにそれを行う方法でなければなりません –

答えて

5

解決策は思ったよりもはるかに簡単でした。重要な部分は、ベンチマークが初期化されるときにスプリングブートアプリケーションを起動することです。構成コンテキストのクラスレベルの変数を定義し、ベンチマークの設定中にその変数への参照を与えます。ベンチマーク内のBeanメソッドを呼び出します。

import java.io.File; 
import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.concurrent.TimeUnit; 
import org.openjdk.jmh.annotations.Benchmark; 
import org.openjdk.jmh.annotations.BenchmarkMode; 
import org.openjdk.jmh.annotations.Level; 
import org.openjdk.jmh.annotations.Mode; 
import org.openjdk.jmh.annotations.OutputTimeUnit; 
import org.openjdk.jmh.annotations.Scope; 
import org.openjdk.jmh.annotations.Setup; 
import org.openjdk.jmh.annotations.State; 
import org.openjdk.jmh.infra.Blackhole; 
import org.openjdk.jmh.runner.Runner; 
import org.openjdk.jmh.runner.options.Options; 
import org.openjdk.jmh.runner.options.OptionsBuilder; 
import org.springframework.boot.SpringApplication; 
import org.springframework.context.ConfigurableApplicationContext; 

@BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MINUTES) 
@State(Scope.Thread) 
public class ProcessFeedBenchMark { 

    public static void main(String args[]) throws Exception { 
     URLClassLoader classLoader = (URLClassLoader) ProcessFeedBenchMark.class.getClassLoader(); 
     StringBuilder classpath = new StringBuilder(); 
     for(URL url : classLoader.getURLs()) 
      classpath.append(url.getPath()).append(File.pathSeparator); 
     classpath.append("/D:/work/zymespace/benchmark/src/main/resources/").append(File.pathSeparator); 
     System.out.print(classpath.toString()); 
     System.setProperty("java.class.path", classpath.toString()); 

     Options opt = new OptionsBuilder() 
     .include(ProcessFeedBenchMark.class.getName() + ".*") 
     .timeUnit(TimeUnit.MILLISECONDS) 
     .threads(1) 

     .shouldFailOnError(true) 
     .shouldDoGC(true) 
     .build(); 

     new Runner(opt).run(); 
    } 
    static ConfigurableApplicationContext context; 

    private BenchmarkTestService service; 

    @Setup (Level.Trial) 
    public synchronized void initialize() { 
     try { 
      String args = ""; 
      if(context == null) { 
       context = SpringApplication.run(BenchmarkSpringBootStater.class, args); 
      } 
      service = context.getBean(BenchmarkTestService.class); 
      System.out.println(service); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Benchmark 
    public void benchmark1 (ProcessFeedBenchMark state, Blackhole bh) { 
     try { 
      service.li(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+3

私はあなたがこのベンチマークから抜け出す数に頼らないでしょう。おそらく、サービスの構成とプロキシメカニズムに頼っているでしょう。また、ほとんどの時間は印刷結果に費やされます。むしろ、メソッドからサービスの値を返し、JMHがエスケープを処理するようにする必要があります。これはJMHの使い方ではありません。 –

+0

li()メソッドの正しいベンチマークを得るために、System.out.printlnステートメントが削除されています。 –

+0

素晴らしい、ありがとうございます。 –

関連する問題