我运行了一个测试,找到了我的程序的最佳并发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
答案 0 :(得分:3)
请注意,您首先运行HashSet
测试。
SynchronizedSet
在我的机器上,在仅第一次测试中更快。 HashSet
再次获胜。在此处详细了解:How do I write a correct micro-benchmark in Java?
此外,请查看Google Caliper以获取处理所有这些微基准测试问题的框架。
答案 1 :(得分:0)
是 尝试在常规之前运行同步设置,您将获得“所需”的结果。 我认为这与JVM热身有关,没有别的。 尝试通过一些计算来警告VM,然后运行基准测试或以混合顺序运行它几次。