我已经写了基准get
和HashMap
如下remove
:在HashMap中,remove()比get()更快吗?
@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()
怎么快?或者我错过了什么?
更新 采用了最新的江铃控股有限公司(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
您的样本量太小,甚至没有意义。对于这种“轻量级”操作,通常应该在计算平均值之前进行5-10秒的采样和采样。 –
@Norwæ他正在使用jmh执行60次运行,这应该足够好并且还会给出统计错误。 – assylias
你使用的是什么java版本和jmh版本? – AdamSkywalker