Использование JMH - PullRequest
       9

Использование JMH

0 голосов
/ 15 января 2019

Я хочу сделать очень простой бенчмарк с JMH: 3 раунда не параллельных запусков метода и выводит каждый тайминг. Я немного озадачен результатами. Какой счет? Как я могу распечатать реальное время?

Это пример результата печати

Result "runs":
  0,779 ±(99.9%) 0,326 ops/s [Average]
  (min, avg, max) = (0,101, 0,779, 1,738), stdev = 0,375
  CI (99.9%): [0,453, 1,104] (assumes normal distribution)


# Run complete. Total time: 00:02:08

Benchmark              Mode  Cnt  Score   Error  Units
SimpleJaxInsert.runs  thrpt   20  0,779 ± 0,326  ops/s

Кроме того, мне действительно нужен этот код? Здесь вы можете увидеть несколько стендов без Runner класса использования http://tutorials.jenkov.com/java-performance/jmh.html#state-scope, но я не могу заставить его работать. Где можно найти минимальный пример использования JMH (возможно, до 2018 года)?

public static void main(String[] args) throws RunnerException {

Options options = new OptionsBuilder()
        .include(SimpleJaxInsert.class.getSimpleName()).threads(1)
        .forks(1).shouldFailOnError(true).shouldDoGC(true)
        .jvmArgs("-server").build();
new Runner(options).run();

}

1 Ответ

0 голосов
/ 31 января 2019

Взгляните на этот простой тест:

@State(Scope.Benchmark)
@Fork(value = 1)
@Warmup(iterations = 3, time = 300, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@BenchmarkMode(Mode.Throughput)
public class SimpleBenchmark {

    int[] array;

    @Setup
    public void setup() {
        this.array = new int[100_000];
    }

    @Benchmark
    public void dec_all() {
        for(int i = 0; i < this.array.length; i++){
            this.array[i]--;
        }
    }

    @Benchmark
    public void dec_half() {
        for(int i = 0; i < this.array.length; i+=2){
            this.array[i]--;
        }
    }
}

Вариант № 1 - Терминал . Если вы используете Maven, вам понадобится что-то подобное в вашем pom.xml

[...]

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.2</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <finalName>${uberjar.name}</finalName>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>org.openjdk.jmh.Main</mainClass>
                            </transformer>
                        </transformers>
                        <filters>
                            <filter>
                                <!-- Shading signed JARs will fail without this. /832298/nevernyi-fail-podpisi-pri-popytke-zapustit-jar -->
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Затем просто запустите его в терминале / консоли:

mvn clean package
java -jar target/benchmarks.jar

Вариант № 2 - IDE . Запустите его из main в вашей IDE:

import org.openjdk.jmh.Main;

[...]

public static void main(String... args) throws Exception {
    Main.main(args); // WARN: for better results run it from terminal!
}

В результате вы увидите:

Benchmark                  Mode  Cnt      Score     Error  Units
SimpleBenchmark.dec_all   thrpt   10  37278,685 ± 757,013  ops/s
SimpleBenchmark.dec_half  thrpt   10  28749,803 ± 811,464  ops/s

Из-за @BenchmarkMode(Mode.Throughput) вы получите [ops / s] ( операций в секунду ). Попробуйте другие режимы, например AverageTime

Вы также можете попробовать этот шаблон: https://github.com/jawb-software/template-jmh-benchmark/tree/simple

...