JMH之三种常见Map性能对比
测试代码
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Benchmark)
public class TestMap_JMH {
static Map hashMap = new HashMap();
static Map synMap = Collections.synchronizedMap(new HashMap<>());
static Map conMap = new ConcurrentHashMap();
@Setup
public void setup(){
for (int i=0;i<1000;i++){
hashMap.put(Integer.toString(i),Integer.toString(i));
synMap.put(Integer.toString(i),Integer.toString(i));
conMap.put(Integer.toString(i),Integer.toString(i));
}
}
@Benchmark
public void hashMapGet(){
hashMap.get("4");
}
@Benchmark
public void synMapGet(){
synMap.get("4");
}
@Benchmark
public void conMapGet(){
conMap.get("4");
}
@Benchmark
public void hashMapSize(){
hashMap.size();
}
@Benchmark
public void synMapSize(){
synMap.size();
}
@Benchmark
public void conMapSize(){
conMap.size();
}
public static void main(String[] args) {
Options opt = new OptionsBuilder().include(TestMap_JMH.class.getSimpleName())
.forks(2).build();
try {
new Runner(opt).run();
} catch (RunnerException e) {
e.printStackTrace();
}
}
}
测试结果
Benchmark Mode Cnt Score Error Units
TestMap_JMH.conMapGet thrpt 10 178.179 ± 17.030 ops/us
TestMap_JMH.conMapSize thrpt 10 777.735 ± 35.146 ops/us
TestMap_JMH.hashMapGet thrpt 10 168.352 ± 7.346 ops/us
TestMap_JMH.hashMapSize thrpt 10 1434.474 ± 36.197 ops/us
TestMap_JMH.synMapGet thrpt 10 40.580 ± 1.227 ops/us
TestMap_JMH.synMapSize thrpt 10 44.711 ± 1.657 ops/us
结论
使用了两个线程进行测试,由于HashMap完全不关心线程安全,所以他的性能是最好的。
HashMap经过同步的包装后,性能出现了急剧的下降。
ConcurrentHashMap的get方法和HashMap的get方法性能近似。