基于执行顺序的HashMap和HashSet的执行时间不同?

时间:2013-11-22 12:16:57

标签: java hashmap hashset

如果我交换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");
}

3 个答案:

答案 0 :(得分:2)

原因是JVM的工作方式。 JIT编译器需要一些时间才能启动,因为它根据执行次数决定编译哪些代码。

所以,第二遍更快是很自然的,因为JIT已经将很多Java代码编译成本机代码。

如果使用-Xint选项(禁用JIT)启动程序,则两次运行的执行时间应大致相等。

答案 1 :(得分:2)

一个可能的原因是你在执行基准测试之前没有为JIT做准备。

基本上,Java执行字节码(稍微慢一些),然后才弄清楚经常使用什么来证明JIT将其编译成本机代码(这更快)。因此,无论先发生什么,通常都会变慢。

在开始真正的基准测试之前,先运行两次,以便有机会JIT相关代码。

答案 2 :(得分:0)

您没有获得不同的执行时间,您获得的执行时间相同。无论您使用HashMap还是HashSet,第一次循环都会获得相同的时间,第二次循环的时间相同。已经解释了第一个和第二个之间的差异,这是由于JVM的优化。毫无疑问,无论您使用HashMap还是HashSetHashSet在内部使用HashMap都无关紧要。您一直在执行相同的代码。