标签: jmh

JMH 使用 javaagent 进行测试

我正在尝试衡量 JVM 代理对性能的影响,以确保它不会使我们尝试运行的测试无效(并且可能会从 prod 中获取一些样本)。此案例是一组将在自动负载测试期间运行的 BTrace 脚本,但该问题可能对任何代理都是通用的。

为了运行基准测试,我建立了一个小型 JMH 项目并将代理附加为:

java -javaagent:/home/ssube/btrace/build/btrace-agent.jar=scriptdir=/home/ssube/btrace/scripts/,port=0 -jar benchmarks.jar
Run Code Online (Sandbox Code Playgroud)

这样做会导致每次 JMH fork JVM 时出现以下错误:

# Run progress: 0.00% complete, ETA 00:02:00
# Fork: 1 of 1
Exception in thread "main" java.lang.IllegalArgumentException: org.openjdk.jmh.runner.options.CommandLineOptions; local class incompatible: stream classdesc serialVersionUID = 8906142321598115825, local class serialVersionUID = 7529911323947566771
    at org.openjdk.jmh.runner.ForkedMain.main(ForkedMain.java:72)
<binary link had failed, forked VM corrupted the stream? Use EXTRA verbose to print exception>
<forked VM failed with exit code 1>
<stdout last='10 lines'>
</stdout>
<stderr last='10 …
Run Code Online (Sandbox Code Playgroud)

java performance-testing btrace jmh

3
推荐指数
1
解决办法
1190
查看次数

JMH 与 JMeter 用于对 Java 类进行基准测试?

如果我想对我的 Java 类中的方法进行基准测试,哪个是更好的选择?两者之间的优缺点是什么?

java jmeter load-testing microbenchmark jmh

3
推荐指数
1
解决办法
1319
查看次数

JMH:不考虑内部方法时间

我有:像这样的方法:

@GenerateMicroBenchmark
public static void calculateArraySummary(String[] args) {
    // create a random data set
    /* PROBLEM HERE: 
     * now I measure not only pool.invoke(finder) time,
     * but also generateRandomArray method time
     */
    final int[] array = generateRandomArray(1000000); 

    // submit the task to the pool
    final ForkJoinPool pool = new ForkJoinPool(4);
    final ArraySummator finder = new ArraySummator(array);
    System.out.println(pool.invoke(finder));
}

private static int[] generateRandomArray(int length) {
    final int[] array = new int[1000000];
    final Random random = new Random();
    for (int i …
Run Code Online (Sandbox Code Playgroud)

java benchmarking microbenchmark jmh

2
推荐指数
1
解决办法
525
查看次数

JMH:初始堆大小无效

我用JMH测试我的程序性能.并且无法配置堆大小.我想知道为什么它不起作用.

问题:

  1. 为什么JMH不接受堆大小配置?
  2. JMH是否在没有jvmArgs方法的情况下吸收想法堆大小设置?

错误:

# Run progress: 0.00% complete, ETA 00:04:30
# VM invoker: /usr/lib/jvm/java-8-oracle/jre/bin/java
# VM options: -Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M
# Fork: 1 of 1
Invalid initial heap size: -Xms2048m -Xmx2048m -XX:MaxDirectMemorySize=512M
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
<forked VM failed with exit code 1>
Run Code Online (Sandbox Code Playgroud)

主要方法:

public static void main(String... args) throws RunnerException, IOException {
    Options opt = new OptionsBuilder()
            .include(".*" + ArraySummatorBenchmarking.class.getSimpleName() + ".*") …
Run Code Online (Sandbox Code Playgroud)

java jvm jvm-arguments microbenchmark jmh

2
推荐指数
1
解决办法
9223
查看次数

使用JMH时输出奇怪

我正在使用jmh 使用maven并按照http://openjdk.java.net/projects/code-tools中建议的命令行方法对一个简单的应用程序进行基准测试(来自Java派生出java fork-join中的Unexpected Scalability结果/ jmh /。成功设置并建立基准后,我可以使用avgt模式获得以下基准结果:

C:\Users\username\my-app\test>java -jar target/benchmarks.jar -bm avgt -f 1
# JMH 1.10.1 (released 13 days ago)
# VM invoker: C:\Program Files\Java\jre1.8.0_45\bin\java.exe
# VM options: <none>
# Warmup: 20 iterations, 1 s each
# Measurement: 20 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: org.sample.MyBenchmark.testMethod

# Run progress: 0,00% complete, ETA 00:00:40
# Fork: …
Run Code Online (Sandbox Code Playgroud)

java fork-join maven jmh

2
推荐指数
1
解决办法
819
查看次数

Sample和SingleShot之间的JMH差异

什么是设置之间的区别Mode.Sample,并Mode.SingleShot配以measurementIterations一套大多少?它是否实际相同,或两种模式之间存在一些定量差异?

java jmh

2
推荐指数
1
解决办法
1011
查看次数

如何查看JMH中的调用树分析?

我想分析JMH测试并查看像VisualVM中一样的调用树。但是,当我使用StackProfiler时,它为我提供了诸如此类的本机方法,这对我而言完全没有用。

....[Thread state distributions]....................................................................
 59,9%         TIMED_WAITING
 23,0%         WAITING
 17,0%         RUNNABLE

....[Thread state: TIMED_WAITING]...................................................................
 47,3%  78,9% sun.misc.Unsafe.park
  8,3%  13,8% java.lang.Thread.sleep
  4,4%   7,3% java.lang.Object.wait

....[Thread state: WAITING].........................................................................
 21,9%  95,1% sun.misc.Unsafe.park
  1,1%   4,9% java.lang.Object.wait

....[Thread state: RUNNABLE]........................................................................
 13,5%  79,0% sun.nio.ch.EPollArrayWrapper.epollWait
  2,0%  11,5% java.net.SocketInputStream.socketRead0
  1,0%   5,7% java.net.PlainSocketImpl.socketAccept
Run Code Online (Sandbox Code Playgroud)

java profiler profiling microbenchmark jmh

2
推荐指数
1
解决办法
1057
查看次数

Kotlin 的 gradle kapt 插件不适用于自定义源集 (JMH)

拥有一个带有 Gradle 设置的 Kotlin 项目:

apply plugin: 'kotlin'
apply plugin: 'kotlin-kapt'

dependencies {
    kapt 'org.openjdk.jmh:jmh-generator-annprocess:1.18'
    ...
}
Run Code Online (Sandbox Code Playgroud)

将基准放在src/main/kotlin 下可以正常工作。

但是当我为 JMH 添加自定义源集时:

sourceSets {
    jmh {
        compileClasspath += sourceSets.test.runtimeClasspath
        runtimeClasspath += sourceSets.test.runtimeClasspath
    }
}
Run Code Online (Sandbox Code Playgroud)

并将基准测试从src/main/kotlin 移动src/jmh/kotlin,执行基准测试失败:

Exception in thread "main" java.lang.RuntimeException: ERROR: Unable to find the resource: /META-INF/BenchmarkList
    at org.openjdk.jmh.runner.AbstractResourceReader.getReaders(AbstractResourceReader.java:98)
    at org.openjdk.jmh.runner.BenchmarkList.find(BenchmarkList.java:122)
    at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:256)
    at org.openjdk.jmh.runner.Runner.run(Runner.java:206)
    at org.openjdk.jmh.Main.main(Main.java:71)
Run Code Online (Sandbox Code Playgroud)

看起来 kaptJmhKotlin 没有做任何事情:

kaptGenerateStubsJmhKotlin UP-TO-DATE
Skipping task ':kaptJmhKotlin' as it has no source files and no …
Run Code Online (Sandbox Code Playgroud)

gradle kotlin jmh kapt

2
推荐指数
1
解决办法
1081
查看次数

为什么 JMH 报告简单的 Quicksort 如此奇怪的时间——显然与 N * log(N) 不成比例?

出于研究排序算法(我自己的)的意图,我决定将其性能与经典算法进行比较quicksort,令我惊讶的是,我发现我的实现所花费的时间quicksortN log(N). 我彻底尝试在我的quicksort但没有成功。这是排序算法的一个简单版本,处理Integer不同大小的数组,填充随机数,我不知道错误可能潜入何处。我什至计算了我的代码执行的所有比较和交换,并且他们的人数与N log(N). 我完全糊涂了,无法理解我观察到的现实。以下是对包含 1,000、2,000、4,000、8,000 和 16,000 个随机值的数组进行排序的基准测试结果(使用 测量JMH):

Benchmark                       Mode  Cnt       Score     Error  Units    2N / N ratio          
QSortBenchmarks.sortArray01000  avgt    5     561.505 ±   2.992  us/op              
QSortBenchmarks.sortArray02000  avgt    5    2433.307 ±  11.770  us/op    4.334 
QSortBenchmarks.sortArray04000  avgt    5    8510.448 ±  34.051  us/op    3.497 
QSortBenchmarks.sortArray08000  avgt    5   38269.492 ± 161.010  us/op    4.497 
QSortBenchmarks.sortArray16000  avgt    5  147132.524 ± 261.963  us/op    3.845 
Run Code Online (Sandbox Code Playgroud)

显然,我观察到的时间复杂度远非O(n log(n)),几乎是O(n^2)。可能有一个很小的怀疑,即随机种子非常不幸,以至于数组中的值碰巧接近最坏的情况。这个概率非常接近于 0,但不是 …

java quicksort time-complexity jmh

2
推荐指数
1
解决办法
137
查看次数

按正则表达式拆分与多个单字符拆分性能

我使用此基准比较了通过正则表达式和多个单字符拆分来拆分字符串

import org.openjdk.jmh.annotations.*;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class Test {
    static String start = "1, 2, 3, 4, 5, 6, 7, 8. 9. 10. 11. 12.1, 2, 3, 4, 5, 6, 7, 8. 9. 10. 11. 12.1, 2, 3, 4, 5, 6, 7, 8. 9. 10. 11. 12.1, 2, 3, 4, 5, 6, 7, 8. 9. 10. 11. 12.1, 2, 3, 4, 5, 6, 7, 8. 9. 10. 11. 12.1, 2, 3, 4, 5, 6, 7, 8. 9. 10. …
Run Code Online (Sandbox Code Playgroud)

java performance split jmh

2
推荐指数
1
解决办法
76
查看次数