7

JMH を見てみたいのですが、何らかの理由でベンチマークを実行できません。私が試したことを説明しましょう:

  1. Eclipse で Maven プロジェクトをセットアップする
  2. 次のように pom.xml を定義します。 ここに画像の説明を入力

  3. 公式の JMH の例をいくつかダウンロードしました。例として、非常にシンプルで開始するのに適した場所を選択しました 。 /jmh/samples/JMHSample_01_HelloWorld.java

  4. マウスの右クリック > Run As > Java アプリケーション

ただし、これにより出力が生成されます。

Exception in thread "main" No benchmarks to run; check the include/exclude regexps.
at org.openjdk.jmh.runner.Runner.run(Runner.java:155)
at org.openjdk.jmh.samples.JMHSample_01_HelloWorld.main(JMHSample_01_HelloWorld.java:90)

私はグーグルで検索しましたが、上記の例は機能するはずですが、私には当てはまりません。私も読んで問題を解決しようとしましたが、これはうまくいかないようです:

  • Eclipse でメインから JMH を実行すると「一致するベンチマークがありません」
  • 生成されたクラスを手動で /META-INF/MicroBenchmarks に移動しようとしましたが、次のエラーが発生します。

    Exception in thread "main" java.lang.IllegalStateException: Mismatched format for the line: JMHSample_01_HelloWorld.class
    at org.openjdk.jmh.runner.BenchmarkRecord.<init>(BenchmarkRecord.java:92)
    at org.openjdk.jmh.runner.MicroBenchmarkList.find(MicroBenchmarkList.java:133)
    at org.openjdk.jmh.runner.Runner.run(Runner.java:150)
    at JMHSample_01_HelloWorld.main(JMHSample_01_HelloWorld.java:80)
    

JMH は /META-INF/MicroBenchmarks にいくつかの有効な行を生成する必要があるようです。つまり、このフォルダーには生成された Java クラス ファイルが存在しないはずですよね?

誰でも間違いを見つけるのを手伝ってもらえますか? ありがとうございました。

4

4 に答える 4

14

ベンチマークの「ソース コード」は、通常どおりコンパイルされるだけでなく、JMH 注釈プロセッサによって処理される必要があります。JMH 0.5 より前は、アノテーション プロセッサはメインの JMH アーティファクトの一部であったため、単一の依存関係jmh-coreで十分でした。JMH 0.5 では、他の言語のサポートを容易にするために、注釈処理機能が別のアーティファクトに抽出されました。

アノテーション プロセッサを「古い」Java ベースの JMH プロジェクトに戻すには、プロセッサ アーティファクトへの追加の依存関係を宣言する必要があります。

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>${jmh.version}</version>
    <!-- 
    the processor artifact is required only during compilation and 
    does not need to be transitive, hence provided scope
    -->
    <scope>provided</scope> 
</dependency>

新しい JMH プロジェクトの場合、最も簡単な方法は、適切な言語固有のアーキタイプ (Java の他に、Scala、Groovy、および Kotlinアーキタイプがあります) を使用して新しいプロジェクトを生成することです ( JMH ホームページで説明されています) 。

mvn archetype:generate \
      -DinteractiveMode=false \
      -DarchetypeGroupId=org.openjdk.jmh \
      -DarchetypeArtifactId=jmh-java-benchmark-archetype \
      -DgroupId=my.benchmark.group \
      -DartifactId=MyBenchMarkArtifact \
      -Dversion=1.0
于 2014-06-02T06:34:55.960 に答える
0

@Benchmark を含むクラスの名前をリファクタリングした場合、このエラーが発生する可能性があります。

メイン関数でも名前を変更する必要があります。

OptionsBuilder opts = new OptionsBuilder();
opts.include("<new_class_name>");
于 2021-11-12T09:08:58.623 に答える