- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试运行基准测试来比较 Java 中 ArrayLists 和 LinkedLists 的 add 方法有多少 ops/ms。我的基准设置如下,但我无法查明是什么导致内存不足错误。可能是设置方法中列表的初始化?
@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5, time = 5)
@Measurement(iterations = 10, time = 5)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class ListAddBenchmark {
private int NUMBER = 123;
private List<Integer> arrayList, linkedList;
@Param({"1000","100000","1000000"})
public int iterations;
@Setup(Level.Trial)
public void setup() {
arrayList = new ArrayList<>();
linkedList = new LinkedList<>();
}
@Benchmark
public boolean arrayListBenchmark() {
return arrayList.add(NUMBER);
}
@Benchmark
public boolean linkedListBenchmark() {
return linkedList.add(NUMBER);
}
}
这是我得到的输出...
# JMH version: 1.32
# VM version: JDK 11.0.11, OpenJDK 64-Bit Server VM, 11.0.11+9-Ubuntu-0ubuntu2
# VM invoker: /usr/lib/jvm/java-11-openjdk-amd64/bin/java
# VM options: -Xmx4G -Xms2G
# Blackhole mode: full + dont-inline hint
# Warmup: 5 iterations, 5 s each
# Measurement: 10 iterations, 5 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: dev.example.benchmarks.collections.lists.ListAddBenchmark.arrayListBenchmark
# Parameters: (iterations = 1000)
# Run progress: 0.00% complete, ETA 00:22:30
# Fork: 1 of 3
# Warmup Iteration 1: 22716.118 ops/ms
# Warmup Iteration 2: 16060.593 ops/ms
# Warmup Iteration 3: 16104.508 ops/ms
# Warmup Iteration 4: <failure>
java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOf(Arrays.java:3689)
at java.base/java.util.ArrayList.grow(ArrayList.java:238)
at java.base/java.util.ArrayList.grow(ArrayList.java:243)
at java.base/java.util.ArrayList.add(ArrayList.java:486)
at java.base/java.util.ArrayList.add(ArrayList.java:499)
at dev.example.benchmarks.collections.lists.ListAddBenchmark.arrayListBenchmark(ListAddBenchmark.java:60)
at dev.example.benchmarks.collections.lists.jmh_generated.ListAddBenchmark_arrayListBenchmark_jmhTest.arrayListBenchmark_thrpt_jmhStub(ListAddBenchmark_arrayListBenchmark_jmhTest.java:142)
at dev.example.benchmarks.collections.lists.jmh_generated.ListAddBenchmark_arrayListBenchmark_jmhTest.arrayListBenchmark_Throughput(ListAddBenchmark_arrayListBenchmark_jmhTest.java:83)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:470)
at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:453)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
有人可以帮助我做错什么吗?
最佳答案
我已经设法通过在每次拆解迭代中手动调用 System.gc()
来遏制我的 OutOfMemoryError。感谢@majusebetter 帮助确定原因。
我的最终代码现在是这样的:
@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class ListAddBenchmark {
private int NUMBER = 123;
private List<Integer> arrayList, linkedList;
@Setup(Level.Iteration)
public void setup() {
arrayList = new ArrayList<>();
linkedList = new LinkedList<>();
}
@TearDown(Level.Iteration)
public void teardown() {
System.gc();
}
@Benchmark
public boolean arrayListBenchmark() {
return arrayList.add(NUMBER);
}
@Benchmark
public boolean linkedListBenchmark() {
return linkedList.add(NUMBER);
}
}
最终输出(没有任何内存问题)是:
Benchmark Mode Cnt Score Error Units
ListAddBenchmark.arrayListBenchmark thrpt 30 38587.191 ± 722.036 ops/ms
ListAddBenchmark.linkedListBenchmark thrpt 30 13955.916 ± 574.261 ops/ms
关于java - 在 JMH 中对 ArrayList.add() 进行基准测试时出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69903622/
我在网上找不到关于 here 的任何信息,谁能告诉我 ops/us, Cnt, Score, Error 是什么意思。 最佳答案 ops/us - 每微秒的操作(基准方法执行) Cnt - 试验总数(
我在网上找不到关于 here 的任何信息,谁能告诉我 ops/us, Cnt, Score, Error 是什么意思。 最佳答案 ops/us - 每微秒的操作(基准方法执行) Cnt - 试验总数(
在我的 jmh 课上,我正在使用 @BenchmarkMode(Mode.SampleTime) @Measurement(iterations = 10) @Threads(value = 10)
我已经将其视为微基准测试中的潜在陷阱之一。如果您指定@Measurement(或@Warmup)将运行固定的时间量,这意味着,当比较不同的运行(例如,不同的平台、不同版本的 VM 等)时,您将获得更少
想开始做我从现在开始写的方法的基准测试,有很长一段时间的动力,终于决定从昨天开始这样做。但我对我的设置过程感到震惊。 我已经正确安装了 JMH 插件。 所有导入工作正常。 甚至我的 POM 也没有显示
我正在使用 JMH,但发现有些难以理解:我有一种方法用 @Benchmark 注释。我设置了 measurementIterations(3) .该方法被调用了 3 次,但在每次迭代调用中,该函数运行
假设我有一个带有两个参数的 JMH 测试: @Param( { "1", "2", 4", "8", "16" } ) int param1; @Param( { "1", "2", 4", "8",
我正在使用tutorial学习JMH基准测试。 我注意到here中的功能benchMurmur3_128有2个与预热相关的东西。 因此,我对Fork注释中的热身属性和带有迭代属性的Warmup注释之间
我不明白 JMH 结果中的 score 属性?我也没有在网上找到任何关于它的信息。 谁能告诉我,它是关于什么的?据我所知,高分比低分好,但这究竟是什么意思,它是如何计算的? 最佳答案 JMH 支持以下
官方资源 官方Github样例 应用场景 对要使用的数据结构不确定,不知道谁的性能更好 对历史方法代码重构,要评判改造之后的性能提升多少 ( 我要做的场景 )
我用 JMH 测试我的程序性能。并且无法配置堆大小。我想知道为什么它不起作用。 问题: 为什么 JMH 不接受堆大小配置? JMH 是否在没有 jvmArgs 方法的情况下吸收 idea 堆大小设置?
我正在使用 JMH 对 DOM 解析器进行基准测试。我得到了非常奇怪的结果,因为第一次迭代实际上比后面的迭代运行得更快 谁能解释为什么会发生这种情况?另外,百分位数和所有数字是什么意思,为什么它在第三
我正在对 Spring Boot 应用程序启动时间进行基准测试。完整的项目是here ,这是 WIP,但相关类如下。 抽象基本状态: public abstract class BootAbstrac
我有:这样的方法: @GenerateMicroBenchmark public static void calculateArraySummary(String[] args) { // c
我读到了JMH并尝试了提供的示例。 我想做的是测量以下场景的统计数据, [ 1] client order -> [2] server -> [3] start processing the orde
我正在玩 Math.max 看看它是否受到分支预测的影响(不,至少在 x64 的 JDK 上不是,有一个 cmovl),如果按位实现可以与默认实现竞争。所有测试如下所示: @Threads(4) @S
我在 JMH 中看到一个常见问题 ConstantFold ,但是如果我有逆问题怎么办?我需要静态最终字段作为参数。例如,它可以是某些算法的某个常量变量。但在 java-doc 中我看到: {@lin
我正在尝试一个非常快的方法(~20 us/op),它似乎工作得很好,除了一些随机很长的迭代: Iteration 63: 14.319 us/op Iteration 64: 13.128 us/
我想看看是否有一种方法可以告诉 JMH 仅测量微基准调用的所有方法中的一个特定方法。 我想使用单元测试作为基础自动创建微基准,因此我不必手动构建微基准。在我的研究中,我有一个大型代码库,我在其中进行了
我正在运行 JMH 基准测试: Options opt = new OptionsBuilder() .output("C:/test/infinis
我是一名优秀的程序员,十分优秀!