Java 根据执行顺序,HashMap和HashSet的执行时间不同?
如果我交换HashMap和HashSet,我会得到不同的执行时间。首先出现的执行时间总是很长(HashMap/Hashset)。我不确定这背后的原因。谢谢你的帮助 执行1-首先是HashMap,然后是HashSet--- 地图添加时间:2071ms, 设定时间:794ms 执行2-首先是HashSet,然后是HashMap--- 设定时间:2147ms, 地图添加时间:781msJava 根据执行顺序,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();
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
并不奇怪。您一直在执行相同的代码