首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMH基准使用

JMH基准使用
EN

Stack Overflow用户
提问于 2019-01-15 15:27:43
回答 1查看 396关注 0票数 0

我想用JMH做一个非常简单的基准测试:一个方法的3轮非并发运行,并打印每个时间。我对结果有点困惑。比分是多少?我怎么才能打印出真正的时间?

这是一个示例结果打印。

代码语言:javascript
复制
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年)?

代码语言:javascript
复制
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();

}
EN

回答 1

Stack Overflow用户

发布于 2019-01-30 23:04:36

看看这个简单的基准:

代码语言:javascript
复制
@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中需要这样的东西

代码语言:javascript
复制
[...]

<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. http://stackoverflow.com/questions/999489/invalid-signature-file-when-attempting-to-run-a-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>

然后在终端/控制台中运行它:

代码语言:javascript
复制
mvn clean package
java -jar target/benchmarks.jar

选项2- IDE.在IDE中从main运行它:

代码语言:javascript
复制
import org.openjdk.jmh.Main;

[...]

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

因此,您将看到:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54201925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档