Java 根据执行顺序,HashMap和HashSet的执行时间不同?

Java 根据执行顺序,HashMap和HashSet的执行时间不同?,java,hashmap,hashset,Java,Hashmap,Hashset,如果我交换HashMap和HashSet,我会得到不同的执行时间。首先出现的执行时间总是很长(HashMap/Hashset)。我不确定这背后的原因。谢谢你的帮助 执行1-首先是HashMap,然后是HashSet--- 地图添加时间:2071ms, 设定时间:794ms 执行2-首先是HashSet,然后是HashMap--- 设定时间:2147ms, 地图添加时间:781ms private static Random secureRandom = new SecureRandom();

如果我交换HashMap和HashSet,我会得到不同的执行时间。首先出现的执行时间总是很长(HashMap/Hashset)。我不确定这背后的原因。谢谢你的帮助

执行1-首先是HashMap,然后是HashSet--- 地图添加时间:2071ms, 设定时间:794ms

执行2-首先是HashSet,然后是HashMap--- 设定时间:2147ms, 地图添加时间:781ms

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");
}
private static Random secureRandom=new secureRandom();
公共静态void main(字符串参数[])
{
int testnumber=1000000;
//哈希映射
long starttimemap=System.currentTimeMillis();
Map hashmap=新hashmap();
对于(int i=0;i
原因在于JVM的工作方式。JIT编译器需要一些时间来启动,因为它根据执行计数决定要编译的代码

因此,第二次传递速度更快是完全自然的,因为JIT已经将大量Java代码编译为本机代码


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

原因在于JVM的工作方式。JIT编译器需要一些时间来启动,因为它根据执行计数决定要编译的代码

因此,第二次传递速度更快是完全自然的,因为JIT已经将大量Java代码编译为本机代码


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

一个可能的原因是在执行基准测试之前没有预热JIT

基本上,Java会执行字节码(稍微慢一点)一段时间,然后才弄清楚经常使用什么来证明JIT可以将其编译为本机代码(速度更快)。因此,任何先发生的事情通常都会比较慢


在开始真正的基准测试之前,先运行这两个程序多次,让它有机会JIT相关代码。

一个可能的原因是,在执行基准测试之前,您没有预热JIT

基本上,Java会执行字节码(稍微慢一点)一段时间,然后才弄清楚经常使用什么来证明JIT可以将其编译为本机代码(速度更快)。因此,任何先发生的事情通常都会比较慢


在开始真正的基准测试之前,先运行这两个程序几次,让它有机会JIT相关的代码。

您不会得到不同的执行时间,而是得到相同的执行时间。无论是使用
HashMap
还是
HashSet
,第一个循环和第二个循环的时间都是相同的。第一个和第二个的区别已经解释过了,这是由于JVM的优化。当
HashSet
在内部使用
HashMap
时,使用
HashMap
HashSet
并不奇怪。您一直在执行相同的代码。

您得到的不是不同的执行时间,而是相同的执行时间。无论是使用
HashMap
还是
HashSet
,第一个循环和第二个循环的时间都是相同的。第一个和第二个的区别已经解释过了,这是由于JVM的优化。当
HashSet
在内部使用
HashMap
时,使用
HashMap
HashSet
并不奇怪。您一直在执行相同的代码