我想用JMH对JCF中List接口的一些方法进行基准测试。我是JMH的新手。我阅读了JMH网站上提供的示例代码。 在我的代码中,我想看看将一个列表中的元素添加到另一个列表需要多长时间。例如,当源列表大小为100,1000,10000等时,从ArrayList到LinkedList,反之亦然。
我使用Level.Iteration进行设置和拆卸方法并正确清除列表。但是当我打印目的地列表(dst)的列表大小时,我得到了这个结果:
Before teardown100 dst size: **2373600** //This is the last call output
46,335 us/op
Run result: 46,33 us/op (<= 2 samples)
# Run complete. Total time: 00:00:05
Benchmark (changeTypes) (size) Mode Samples Score Score error Units
d.d.t.d.b.c.CollectionCopyBenchmark.copyCollection AL-LL 100 avgt 1 58,446 NaN us/op
d.d.t.d.b.c.CollectionCopyBenchmark.copyCollection LL-AL 100 avgt 1 46,335 NaN us/op
以下是代码:
@State(Scope.Thread)
@Warmup(iterations = 1)
@Measurement(iterations = 1)
@Fork(1)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public class CollectionCopyBenchmark {
@Param({"AL-LL", "LL-AL"})
String changeTypes;
//@Param({"100", "1000", "10000", "100000"})
@Param({"100"})
int size;
private Collection src, dst;
Collection<Integer> ll = new LinkedList<>();
Collection<Integer> al = new ArrayList<>();
@Setup(Level.Iteration)
public void setup(){
String[] str = changeTypes.split("-");
String srcCollection = str[0];
String dstCollection = str[1];
al.clear();
ll.clear();
switch (srcCollection) {
case "LL" : src = ll; break;
case "AL" : src = al; break;
}
switch (dstCollection) {
case "LL" : dst = ll; break;
case "AL" : dst = al; break;
}
for (int i = 0; i < size; i++) {
src.add(i);
}
}
@Benchmark
public void copyCollection(Blackhole bh) {
dst.addAll(src);
System.out.println(dst.size());
bh.consume(dst.size());
}
@TearDown(Level.Iteration)
public void tearDown() {
System.out.println("Before teardown" + src.size() + " dst size: "+ dst.size());
src.clear();
dst.clear();
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(CollectionCopyBenchmark.class.getSimpleName())
.build();
new Runner(opt).run();
}
}
任何人都可以帮助我理解为什么我得到2373600作为目的地列表的大小?
当我使用Level.Invocation时,我得到不同的输出。我在Invocation和Interation级别之间感到困惑。如果我想计算不同列表大小的基准方法的平均时间,我应该考虑哪个级别?