我正在尝试衡量 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 类中的方法进行基准测试,哪个是更好的选择?两者之间的优缺点是什么?
我有:像这样的方法:
@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) 我用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) 我正在使用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) 什么是设置之间的区别Mode.Sample,并Mode.SingleShot配以measurementIterations一套大多少?它是否实际相同,或两种模式之间存在一些定量差异?
我想分析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) 拥有一个带有 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) 出于研究排序算法(我自己的)的意图,我决定将其性能与经典算法进行比较quicksort,令我惊讶的是,我发现我的实现所花费的时间quicksort与N 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,但不是 …
我使用此基准比较了通过正则表达式和多个单字符拆分来拆分字符串
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)