JMH Collections复制基准

时间:2016-04-20 18:58:25

标签: java microbenchmark jmh

我想用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级别之间感到困惑。如果我想计算不同列表大小的基准方法的平均时间,我应该考虑哪个级别?

0 个答案:

没有答案