标签: jmh

java缓存方法的结果

我使用 JMH来指定操作的复杂性.如果您从未与JMH合作过,请不要担心.JMH将estimateOperation多次启动该方法,然后获得平均时间.

问题:[缩小]这个程序Math.cbrt(Integer.MAX_VALUE)每次计算一次吗?或者只是计算一次然后返回缓存结果?

@GenerateMicroBenchmark
public  void estimateOperation() {
    calculate();
}

public int calculate() {
    return Math.cbrt(Integer.MAX_VALUE);
}
Run Code Online (Sandbox Code Playgroud)

问题:[broad]: JVM是否会缓存方法的结果?

java caching jvm microbenchmark jmh

5
推荐指数
1
解决办法
840
查看次数

通过JMH测量sun.misc.Unsafe.compareAndSwap中的奇怪行为

我决定用不同的锁定策略测量增量,并为此目的使用JMH.我正在使用JMH来检查吞吐量和平均时间以及用于检查正确性的简单自定义测试.有六种策略:

  • 原子计数
  • ReadWrite锁定计数
  • 与volatile同步
  • 同步块没有volatile
  • sun.misc.Unsafe.compareAndSwap
  • sun.misc.Unsafe.getAndAdd
  • 不同步计数

基准代码:

@State(Scope.Benchmark)
@BenchmarkMode({Mode.Throughput, Mode.AverageTime})
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Fork(1)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
public class UnsafeCounter_Benchmark {
    public Counter unsync, syncNoV, syncV, lock, atomic, unsafe, unsafeGA;

    @Setup(Level.Iteration)
    public void prepare() {
        unsync = new UnsyncCounter();
        syncNoV = new SyncNoVolatileCounter();
        syncV = new SyncVolatileCounter();
        lock = new LockCounter();
        atomic = new AtomicCounter();
        unsafe = new UnsafeCASCounter();
        unsafeGA = new UnsafeGACounter();
    }

    @Benchmark
    public void unsyncCount() {
        unsyncCounter();
    }

    @CompilerControl(CompilerControl.Mode.DONT_INLINE)
    public void unsyncCounter() {
        unsync.increment(); …
Run Code Online (Sandbox Code Playgroud)

java cas microbenchmark jmh

5
推荐指数
1
解决办法
750
查看次数

微型基准测试JMH中具有不同值的循环

众所周知,在JMH基准测试中使用循环并不是一个好主意,因为它将由JIT编译器进行优化,因此应该避免使用.有没有办法在int不使用循环的情况下为不同的输入值(输入列表)提供JMH基准测试方法.

java jmh

5
推荐指数
1
解决办法
4613
查看次数

如何在JMH示例中消除Math.log()的死代码

每个试图利用JMH框架创建一些有意义的测试的人都会看到JMH样本测试(http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/ org/openjdk/jmh/samples /).当我们经历它们时,我们坚持使用死代码(JMHSample_08_DeadCode.java).

摘抄:

private double x = Math.PI;

@Benchmark
public void baseline() {
 // do nothing, this is a baseline
}

@Benchmark
public void measureWrong() {
 // This is wrong: result is not used, and the entire computation is optimized out.
 Math.log(x);
}
Run Code Online (Sandbox Code Playgroud)

measureWrong()的测量值与基线测试的测量值大致相同.因为从不使用Math.log()的返回值.因此HotSpot编译器将消除死代码.好的,理解但是编译器如何确定可以消除Math.log().

当我们仔细观察测试时,我们注意到Math.log()是一种本机方法.本机调用转到操作系统并执行相应的lib.对?这导致我们假设编译器可以消除本机调用,如果它们的返回值未被使用且它们不执行io操作.

我们想知道如果存在于操作系统某处并且处理来自java世界的本机调用的lib不提供返回值但是执行操作(例如,日志记录)会是什么.这些说明会完全消失吗?

为了证明我们的假设,我们使用简单的JMH测试和本机调用重建了场景.我们编译了三个c-native libs来执行:

  1. 返回42
  2. 参数添加
  3. 空文件创建

正如我们在JMH测试中调用它们(类似于measureWrong()测试),它们都没有被消除,甚至没有消除执行io操作的那个.由于测试结果,我们的假设无法确认.本机调用无法优化,这意味着Math.log()和自定义本机调用没有相同的基础.它们不是原生的.也许我们在我们的原生lib代码中犯了一个错误,至少测试1的本地调用应该已被删除.如果这是真的,我们将与您分享我们的代码.

所以我们进一步搜索并找到了一个术语Intrinsics,其中java代码将被替换为对应于体系结构非常优化的代码.java.lang.Math.log()具有这样的内部实现.Natives和Intrinsics之间有什么关系吗?如果上述Natives和Intrinsics之间关系的假设有效,编译器会执行以下步骤来消除本机调用吗?

  • 在编译时,HotSpot检查Math.log()是否存在内部实现(在jdk中?),并用该代码替换Math.log().
  • 之后,第二次检查发生在HotSpot查看方法的返回值的位置.在此结果上,HotSpot决定完全消除Math.log()调用.

java intrinsics microbenchmark jmh

5
推荐指数
1
解决办法
411
查看次数

Java无锁性能JMH

我有一个JMH多线程测试:

@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Fork(value = 1, jvmArgsAppend = { "-Xmx512m", "-server", "-XX:+AggressiveOpts","-XX:+UnlockDiagnosticVMOptions",
        "-XX:+UnlockExperimentalVMOptions", "-XX:+PrintAssembly", "-XX:PrintAssemblyOptions=intel",
        "-XX:+PrintSignatureHandlers"})
@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)
@Warmup(iterations = 3, time = 2, timeUnit = TimeUnit.SECONDS)
public class LinkedQueueBenchmark {
private static final Unsafe unsafe = UnsafeProvider.getUnsafe();
private static final long offsetObject;
private static final long offsetNext;

private static final int THREADS = 5;
private static class Node {
    private volatile Node next;
    public Node() {}
}

static {
    try { …
Run Code Online (Sandbox Code Playgroud)

java multithreading nonblocking memory-barriers jmh

5
推荐指数
1
解决办法
745
查看次数

为什么在JMH中缺少@GenerateMicroBenchmark以及它的替代品是什么?

我尝试用JMH创建基准测试,我发现所有教程都参考了@GenerateMicroBenchmark.

但我无法在jmh-core中找到它:1.11.3.

如果它被删除了,它的替代品是什么,以及在没有该注释的情况下创建基准测试的惯用方法是什么.

java jvm-hotspot jmh

5
推荐指数
1
解决办法
1402
查看次数

为什么(n mod const)比(const mod n)更快?

在玩jmh时,我遇到了一个奇怪的事情,我无法解释.

@BenchmarkMode(Mode.SingleShotTime)
@Measurement(iterations = 10, batchSize = Integer.MAX_VALUE)
@Warmup(iterations = 5, batchSize = Integer.MAX_VALUE)
@State(Scope.Thread)
public class Tests {
    private int value;

    @Setup(Level.Iteration)
    public void setUp() {
        value = 1230;
    }

    @Benchmark
    public boolean testConstModN() {
        return 12345 % value == 0;
    }

    @Benchmark
    public boolean testNModConst() {
       return value % 12345 == 0;
   }
}
Run Code Online (Sandbox Code Playgroud)

结果如下

Benchmark                  Mode  Cnt   Score   Error  Units
Tests.testConstModN          ss   10  10.789 ± 0.305   s/op
Tests.testNModConst          ss   10   7.550 ± 0.067   s/op
Run Code Online (Sandbox Code Playgroud)

我运行的是JDK 1.8.0_101,VM 25.101-b13,Intel(R)Core(TM)i7-4770 …

java x86-64 jmh

5
推荐指数
1
解决办法
124
查看次数

当参数来自其他方法时,如何摆脱JMH中的“方法参数应为@State类”?

我正在做一个Maven项目。情况如下所示...

class Test {

    public void applyAll() {
        ....................
        ....................
        Collection<Migratable> applicableUpdates = SomeOtherClass.getApplicableUpdates();
        doUpdate(applicableUpdates);

    }

    @Benchmark
    public void apply(Migratable m) {
        ....................
        ....................
    }

    private void doUpdate(Collection<Migratable> applicableUpdates) throws Exception {
        for (Migratable m : applicableUpdates) {
            try {

                apply(m);

            } catch (Exception e) {
                logger.error("Falid to apply migration {}" + m, e);
                throw e;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要计算执行每次迁移需要多长时间。我只需要计算apply(Migratable m)方法的执行时间。
现在,当我使用“ mvn clean install”构建项目时,构建失败,并且显示“方法参数应为@State类”。

在这里,参数来自另一个方法doUpdate(Collection applyUpdates) [请参见场景]。那么如何在给定的情况下摆脱这个错误呢?

java microbenchmark jmh

5
推荐指数
1
解决办法
1193
查看次数

无法在java9下运行jmh测试

所以基本上我试图以下列形式运行测试:

@Benchmark
@Fork(jvmArgsAppend = "-Djava.lang.invoke.stringConcat=java.lang.invoke.StringConcatFactory.Strategy.BC_SB", value = 1)
public String java9StringBuilder(ThreadState state) {
    // some implementation here
}
Run Code Online (Sandbox Code Playgroud)

运行它:

java -jar benchmarks.jar MyFullClassNameHere -v extra
Run Code Online (Sandbox Code Playgroud)

不幸的是,它失败了forked VM failed with exit code 1并且没有更多的"详细"输出.

我做错了什么?

我确实得到了这些警告:

警告:未知模块:org.openjdk指定为--add-exports

警告:发生了非法反射访问操作

警告:org.openjdk.jmh.util.Utils(文件:/Path/Here/benchmarks.jar)对字段java.io.Console.cs进行非法反射访问

警告:请考虑向org.openjdk.jmh.util.Utils的维护者报告此情况

警告:使用--illegal-access = warn启用进一步非法反射访问操作的警告

警告:将来的版本中将拒绝所有非法访问操作

java jmh java-9

5
推荐指数
1
解决办法
568
查看次数

错误:找不到或加载主类org.openjdk.jmh.runner.ForkedMain

我正在通过春季启动应用程序使用jmh对一些方法进行基准测试。当我通过IDE运行它时,它为我提供了基准,但是当我将其与maven打包并通过CMD运行时,它给出了以下堆栈跟踪。

# Run progress: 0.00% complete, ETA 00:11:00
# Fork: 1 of 1
Error: Could not find or load main class org.openjdk.jmh.runner.ForkedMain
<forked VM failed with exit code 1>
<stdout last='20 lines'>
</stdout>
<stderr last='20 lines'>
Error: Could not find or load main class org.openjdk.jmh.runner.ForkedMain
</stderr>

Benchmark had encountered error, and fail on error was requested
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: …
Run Code Online (Sandbox Code Playgroud)

java benchmarking maven spring-boot jmh

5
推荐指数
1
解决办法
530
查看次数