8

jmh 0.6。依存関係として jmh-core、jmh-generator-annprocess、jmh-generator-reflection があります。

まず、残念ながらドキュメントが貧弱です。1 つには、maven ではなく gradle を使用しているため、maven アーキタイプを使用することはできません。

2 つ目は、コマンド ラインではなく Java API を使用することです。

私の非常に単純なコードは次のとおりです。

public final class TestBenchmark
{
    private static final int COUNT = 100_000;
    private static final List<Integer> LIST = new ArrayList<>();

    static {
        for (int i = 0; i < COUNT; i++)
            LIST.add(i);
    }

    @GenerateMicroBenchmark
    public void foreachLoop()
    {
        int dummy;
        for (final int i: LIST)
            dummy = i;
    }

    @GenerateMicroBenchmark
    public void forLoop()
    {
        int dummy;
        final int size = LIST.size();
        for (int i = 0; i < size; i++)
            dummy = LIST.get(i);
    }

    public static void main(final String... args)
        throws RunnerException
    {
        final Options options = new OptionsBuilder()
            .forks(1)
            .warmupIterations(1)
            .measurementIterations(20)
            .verbosity(VerboseMode.EXTRA)
            .build();

        new Runner(options).run();
    }
}

がないので、正規表現として.include()意味する.*ため、すべてのベンチマークです。これは、私のプロジェクトにある唯一のクラスです。

しかし、いいえ:「ベンチマークが見つかりません」。

したがって、最後の手段としてMETA-INF/MicroBenchmarks、他の場所で提案されているようにファイルを作成してみました。コンテンツ、クラスの名前:

com.github.parboiled1.grappa.TestBenchmark

しかし、それも機能しません:

Exception in thread "main" java.lang.IllegalStateException: Mismatched format for the line: com.github.parboiled1.grappa.TestBenchmark

もちろん、このファイルの形式は文書化されていません。

しかし、最初からこのファイルを使用したくありません。実行するクラスのリストを指定したい。

それ、どうやったら出来るの?

4

2 に答える 2

8

あなたの問題は、ベンチマークの不一致に関するものではなく、JMH が合成ベンチマーク コードを生成してコンパイルするのを妨げたビルドの構成ミスです。後で API を使用する場合でも、アノテーション プロセッサを実行させ、ビルドの残りの部分で生成されたソースとリソースを完全なバンドルにパックする必要があります。Maven archetype によって作成されたプロジェクトはまさにそれを行います。他のビルド システムで何が起こるべきかを正確に指定するAnt サンプルもあります。Gradleでそれをしたい場合は、これを試してください

PS JMH では、META-INF/MicroBenchmarks は内部 API であり、予告なく変更される場合があります。使えなくても不思議ではありません。

于 2014-05-10T19:39:46.177 に答える
2

私は Maven を使用しているので、これはMavenソリューションですが、手順に従えば Gradle に適応できると確信しています。JMH の素晴らしさは、ドキュメントの欠如によって覆い隠されていることを認めざるを得ません。

最初は正しく実行できなかったので、最後にベンチマークを開始する JUnit テスト ケースを作成しました。Jenkinsの方が簡単で、jarプロジェクトを作成していないため、メインはありません。

  1. コードまたはビルド スクリプトから APT プロセッサを実行しました。Maven では、すぐに使用できます
  2. JMH ソース コードが生成されている場合は、成功を確認できます。
  3. ここで、JMH ソース コードをコンパイルする必要があります。Mavenはすぐに使用できます。Gradleについてはわかりません。
  4. クラス ファイルが存在することを確認します。
  5. これで main メソッドを実行できます。

このプロファイルは、maven に *Benchmark.java を追加して確実に実行するように指示します。

<profile>
  <id>benchmark</id>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <includes>
            <include>**/*Benchmark.java</include>
          </includes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>

プロファイル ベンチマークで Maven を実行すると。次に、ベンチマークが実行されます。

于 2014-05-21T19:09:43.310 に答える