【发布时间】:2016-01-20 12:31:16
【问题描述】:
我已经为get 和remove 编写了一个基准测试HashMap 如下:
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class HashMapBenchmark {
@State(Scope.Benchmark)
public static class Mystate {
HashMap<String,String> hashmapVar = new HashMap<String,String>();
String key0 = "bye";
@Setup(Level.Iteration)
public void setup(){
hashmapVar.put(key0,"bubye");
}
}
@Benchmark
public void hashmapGet(Mystate state ,Blackhole bh) {
bh.consume(state.hashmapVar.get(state.key0));
}
@Benchmark
public void hashmapRemove(Mystate state ,Blackhole bh) {
bh.consume(state.hashmapVar.remove(state.key0));
}
}
它产生这个结果:
Benchmark Mode Samples Score Score error Units
c.b.HashMapBenchmark.hashmapGet avgt 60 6.348 0.320 ns/op
c.b.HashMapBenchmark.hashmapRemove avgt 60 5.180 0.074 ns/op
根据结果,remove() 比get() 稍快。
即使要删除一个元素,它也必须首先检索该元素,不是吗?
remove() 怎样才能更快?还是我错过了什么?
更新 使用最新的 JMH (1.11.3) 后,结果如下:
Benchmark Mode Cnt Score Error Units
HashMapBenchmark.hashmapGet avgt 60 9.713 ± 0.277 ns/op
HashMapBenchmark.hashmapRemove avgt 60 7.677 ± 0.166 ns/op
【问题讨论】:
-
您的样本量太小,甚至没有意义。对于此类“轻量级”操作,您通常应该在计算平均值之前进行 tr 和采样 5-10 秒。
-
@Norwæ 他正在使用 jmh 进行 60 次运行,这应该足够好,并且还给出了统计错误。
-
你用的是什么java版本和jmh版本?
-
@AdamSkywalker jdk1.7.0_01 和 JMH 1.0。我不确定 JHM 版本,因为我使用了 maven 原型:
mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=org.openjdk.jmh -DarchetypeArtifactId=jmh-java-benchmark-archetype -
@Ram(我认为这并不重要,但 JMH 版本在您的 POM 中,它是依赖项
jmh-core)如果我没记错的话,它是在 @987654333 中定义的属性jmh.version@ 部分。
标签: java performance hashmap benchmarking jmh