为什么Collections.synchronizedSet(HashSet)比HashSet对addAll,retainAll和contains更快?

时间:2014-07-31 19:06:01

标签: java performance set hashset

我运行了一个测试,找到了我的程序的最佳并发Set实现,使用非同步HashSet作为控件,并遇到了一个有趣的结果:addAll,{{1} } retainAll contains的{​​{1}}操作似乎比常规Collections.synchronizedSet(HashSet)更快。我的理解是HashSet永远不会比SynchronizedSet(HashSet)更快,因为它由带有同步锁的HashSet组成。我现在已经进行了几次测试,结果相似。我做错了吗?

相关结果:

HashSet

相关代码:

Testing set: HashSet
Add: 17.467758 ms
Retain: 28.865039 ms
Contains: 22.18998 ms
Total: 68.522777 ms
--
Testing set: SynchronizedSet
Add: 17.54269 ms
Retain: 20.173502 ms
Contains: 19.618188 ms
Total: 57.33438 ms

2 个答案:

答案 0 :(得分:3)

你不能让JVM变暖。

请注意,您首先运行HashSet测试。

  1. 我稍微更改了你的程序以循环运行测试5次。 SynchronizedSet在我的机器上,在第一次测试中更快。
  2. 然后,我尝试颠倒两个测试的顺序,只运行一次测试。 HashSet再次获胜。
  3. 在此处详细了解:How do I write a correct micro-benchmark in Java?

    此外,请查看Google Caliper以获取处理所有这些微基准测试问题的框架。

答案 1 :(得分:0)

是 尝试在常规之前运行同步设置,您将获得“所需”的结果。 我认为这与JVM热身有关,没有别的。 尝试通过一些计算来警告VM,然后运行基准测试或以混合顺序运行它几次。