如果我交换HashMap和HashSet,我会得到不同的执行时间。首先出现的执行时间总是很高(HashMap / Hashset)。我不确定这背后的原因。任何帮助表示赞赏
执行1 - 首先是HashMap,然后是HashSet --- 时间地图添加:2071ms, 设定时间添加:794ms
执行2 - 首先是HashSet,然后是HashMap --- 设定时间加:2147毫秒, 时间地图添加:781毫秒
private static Random secureRandom = new SecureRandom();
public static void main(String args[])
{
int testnumber = 1000000;
// HashMap
long starttimemap = System.currentTimeMillis();
Map<String, String> hashmap = new HashMap<String, String>();
for (int i = 0; i < testnumber; i++)
{
hashmap.put(Long.toHexString(secureRandom.nextLong()), "true");
}
long endtimemap = System.currentTimeMillis();
System.out.println("Time taken map add: " + (endtimemap - starttimemap) + "ms");
// HashSet
long starttimeset = System.currentTimeMillis();
Set<String> hashset = new HashSet<String>();
for (int i = 0; i < testnumber; i++)
{
hashset.add(Long.toHexString(secureRandom.nextLong()));
}
long endtimeset = System.currentTimeMillis();
System.out.println("Time taken set add: " + (endtimeset - starttimeset) + "ms");
}
答案 0 :(得分:2)
原因是JVM的工作方式。 JIT编译器需要一些时间才能启动,因为它根据执行次数决定编译哪些代码。
所以,第二遍更快是很自然的,因为JIT已经将很多Java代码编译成本机代码。
如果使用-Xint
选项(禁用JIT)启动程序,则两次运行的执行时间应大致相等。
答案 1 :(得分:2)
一个可能的原因是你在执行基准测试之前没有为JIT做准备。
基本上,Java执行字节码(稍微慢一些),然后才弄清楚经常使用什么来证明JIT将其编译成本机代码(这更快)。因此,无论先发生什么,通常都会变慢。
在开始真正的基准测试之前,先运行两次,以便有机会JIT相关代码。
答案 2 :(得分:0)
您没有获得不同的执行时间,您获得的执行时间相同。无论您使用HashMap
还是HashSet
,第一次循环都会获得相同的时间,第二次循环的时间相同。已经解释了第一个和第二个之间的差异,这是由于JVM的优化。毫无疑问,无论您使用HashMap
还是HashSet
,HashSet
在内部使用HashMap
都无关紧要。您一直在执行相同的代码。