当前位置: 首页 > 知识库问答 >
问题:

JMH什么都不做的时候做什么?

姚信鸥
2023-03-14

这是我的第一个JMH基准测试。我可能做错了一切,但是...

我的基准看起来是这样的

@State(Scope.Benchmark) public class JmhBranchingBenchmark {
    private static final int STRING_LENGTH = 100 * 1000;
    private char[][] allQueries = new char[101][];

    @Setup public void up() {
        for (int i=0; i<allQueries.length; ++i) {
            ... fill char[i] with STRING_LENGTH chars
            ... this might take some time, but it's needed only once, or?
        }
    }

   @GenerateMicroBenchmark public void measure5(BlackHole bh) {
       bh.consume(countBreakingWhitespace(allQueries[5]));
   }

   ... some more nearly identical methods as a poor man's replacement for caliper's @Param
}

是我开始的...等了又等,然后杀了它。我怀疑在< code>@Setup中有问题,所以我简化了它,但是什么都没有改变。这场赛跑开始时相当乐观...

time -p java -jar target/microbenchmarks.jar ".*JmhBranchingBenchmark.*" -i 5 -f 1
# Run progress: 0.00% complete, ETA 00:02:05
# VM invoker: /usr/lib/jvm/java-7-oracle/jre/bin/java
# VM options: <none>
# Fork: 1 of 1
# Warmup: 20 iterations, 1 s each
# Measurement: 5 iterations, 1 s each
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: org.openjdk.jmh.samples.JmhBranchingBenchmark.measure10
# Warmup Iteration   1:

然后什么都没发生。过了很长时间,它继续写下20行像

# Warmup Iteration   1: 6.415 ops/ms

和5行像

Iteration   1: 6.506 ops/ms

然后它输出一些结果

Result : 6.510 ±(99.9%) 0.030 ops/ms
  Statistics: (min, avg, max) = (6.502, 6.510, 6.521), stdev = 0.008
  Confidence interval (99.9%): [6.480, 6.540]

并更正其估计的eta:

# Run progress: 20.00% complete, ETA 00:26:52

我的@Setup是否比我想象的更频繁地被调用,或者还有什么其他原因导致了缓慢?

共有1个答案

古文康
2023-03-14

我认为你正在处理非常沉重的@Setup

< code>@Setup(级别。Trial)变懒-在第一次使用< code>@State对象时调用。这些初始化被计入执行时间,这是进行预热的另一个好理由。因此,第一次预热期间的第一次“打嗝”是执行< code>@Setup。现在,JMH将每个< code > @ GenerateMicroBenchmark 运行分支到单独的VM中,因此下一个测试将会经历相同的情况。

 类似资料:
  • 在Java中,什么与Python的pass等效?我意识到我可以使用continue语句或不完成语句体来实现这种效果,但我喜欢使用pass语句。

  • 我的配置文件是类路径的路径。至少我认为是这样。我放置了log4j。资源文件夹中的属性文件,而log4j对此不做任何处理。即使我删除了它,也不会发生错误。 任何人都可以看到,我在使用maven LoggerTest的内容: 程序输出: log4j的内容。属性: 在波姆。xml并不是什么不同寻常的东西,只是一个依赖组织。阿帕奇。登录中。log4j log4j内核2.17.2,编译器源目标是16,没有插

  • 问题内容: 我知道Java中的垃圾回收是自动化的。但是我知道,如果你调用代码,那么JVM可能会或可能不会决定此时执行垃圾回收。这究竟如何工作?JVM看到时会根据什么基础/参数确切地决定执行(或不执行)? 在这种情况下,是否有任何示例是个好主意呢? 问题答案: 实际上,它通常决定进行垃圾回收。答案取决于许多因素,例如您正在运行的JVM,它处于哪种模式以及正在使用哪种垃圾收集算法。 我不会在您的代码中

  • 问题内容: 为什么我们需要特定于数据库的功能,例如mysql_real_escape_string()?addlashes()不能做什么? 暂时忽略了参数化查询的高级替代方案,是一个仅使用addlashes()的web应用仍然容易受到SQL注入的攻击,如果是,怎么办? 问题答案: 当处理多字节编码的字符串时,加号通常不够好。

  • 问题内容: 我有以下定制JPanel,并且已使用Netbeans GUI构建器将其添加到我的框架中,但是背景不会改变!我可以看到用g.fillOval()绘制的圆圈。怎么了? 问题答案: 如果面板“不透明”(透明),您将看不到背景色。

  • 在Windows10中输入以下命令并启动无头chrome版本时,没有发生任何事情(有/没有扩展): 它只是悄悄地返回到命令行,我找不到任何pdf文件。 有人遇到过同样的问题并设法解决了吗? 我正在使用:Google Chrome 63.0.3239.84(官方版本)(64位)(队列:63_Win_84)