私はJMH
を使用してベンチマークしたいアプリケーションを持っています。この統合の参考資料は有用です。JMHベンチマークスプリングブートアプリケーション
答えて
解決策は思ったよりもはるかに簡単でした。重要な部分は、ベンチマークが初期化されるときにスプリングブートアプリケーションを起動することです。構成コンテキストのクラスレベルの変数を定義し、ベンチマークの設定中にその変数への参照を与えます。ベンチマーク内の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();
}
}
}
私はあなたがこのベンチマークから抜け出す数に頼らないでしょう。おそらく、サービスの構成とプロキシメカニズムに頼っているでしょう。また、ほとんどの時間は印刷結果に費やされます。むしろ、メソッドからサービスの値を返し、JMHがエスケープを処理するようにする必要があります。これはJMHの使い方ではありません。 –
li()メソッドの正しいベンチマークを得るために、System.out.printlnステートメントが削除されています。 –
素晴らしい、ありがとうございます。 –
- 1. JMH:@stateクラス
- 2. コントロール数JMH
- 3. JMHここで
- 4. JMHフォーク、スレッド、デバッグ
- 5. メソッドスコープ外のJMHオブジェクト
- 6. JMH測定の反復
- 7. JMHでコール・ツリー・プロファイリングを見るには?
- 8. jmh:ベンチマークを同時に実行する
- 9. jmh設定パラメータの選択方法
- 10. JMH @Forkの目的は何ですか?
- 11. java.lang.NoClassDefFoundError:javaslang/collection/LinkedHashMap jmhを使用したバネデータアプリケーションのベンチマーク中
- 12. IntellijのJMHでベンチマークを行う方法は?
- 13. JMHベンチマークのmaxmiumヒープサイズを報告してください
- 14. jmhベンチマークから状態を変更する際のベストプラクティス
- 15. JMH状態クラスと共有対非共有状態
- 16. 既存のMavenプロジェクトにJMHコードを統合
- 17. JMHを使用してメソッドの順序を制御します
- 18. newInstanceとjdk-9/jdk-8の新機能とjmh
- 19. jmhベンチマークでメソッドを生成するには?
- 20. メソッドパラメータがインタフェースである場合のJMHの統合方法は?
- 21. orientdbにjmh testingを組み込む方法は?
- 22. JMHへのJVM引数の受け渡し
- 23. JMHリソースを見つけることができません:/ META-INF/BenchmarkList
- 24. このJMHベンチマークはマシン間で矛盾しています - なぜですか?
- 25. JMHを使用して '&' vs '%'コストを正しくベンチマークする方法
- 26. JMHの呼び出しごとにデータを初期化する方法は?
- 27. 別のMavenプロジェクトを作成せずにjmhを使用してベンチマークを行う
- 28. JMH BenchmarkはSpring(Mavenを含む)プロジェクトのAutowiredフィールドでNullPointerExceptionを取得します
- 29. DefaultChemObjectBuilder ClassNotFoundExceptionは、端末IntellijのIdeaでjmhベンチマークを実行すると発生します
- 30. 外部プロファイラの下でJMHベンチマークを実行することはできますか?
IMHO 'jmh'は、ベンチマークアプリケーションには適していませんが、特定のメソッドのみに適しています。 –
私は春のMVCアプリケーションのためのbechmarkingを行うために管理しました。彼らはSpringブートアプリケーションのためにそれを行う方法でなければなりません –