我测试了HashMap retainAll方法,以测试哪个方法使用JMH更快.
两个Hashmap A、B
- 尺寸:A&>B,A:300~400,B:100~200
- 大多数B元素都在A中,所以B-A大约是10~20,非常小
测试:获取两个HashMap的交集
-
A.keySet().保留(B.keySet())
-
B.keySet()
//JMH
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Fork(value = 1, jvmArgs={"-Xms4G", "-Xmx4G"})
@Warmup(iterations = 5, time = 5)
@Measurement(iterations = 10, time = 5)
private Map<String, MyClass> bigOne, smallOne;
private final int testIteration = 1000;
@Benchmark
public void smallToBig(){
for(int i=0;i<testIteration;i++){
smallOne.keySet().retainAll(bigOne.keySet());
}
}
@Benchmark
public void bigToSmall(){
for(int i=0;i<testIteration;i++){
bigOne.keySet().retainAll(smallOne.keySet());
}
}
RetainAll方法使用AbstractMap中的CONTAINS,因此HashMap CONTAINS为O(1).因此迭代映射将占用大部分性能,这意味着小一次迭代应该更快.
我原以为前者会更快,但实际结果却不同
我试了很多次,但还是得到了同样的结果.你能告诉我为什么Big.retainAll(小)更快吗?
谢谢你的帮助.