下面的代码使用long
和double
设置不同的时序,无法理解为什么时序存在差异?
public static void main(String[] args) {
long j = 1000000000;
double k = 1000000000;
long t1 = System.currentTimeMillis();
for (int index = 0; index < j; index++) {
}
long t2 = System.currentTimeMillis();
for (int index = 0; index < k; index++) {
}
long t3 = System.currentTimeMillis();
long longTime = t2 - t1;
long doubleTime = t3 - t2;
System.out.println("Time to loop long :: " + longTime);
System.out.println("Time to loop double :: " + doubleTime);
}
输出:
时间长循环:: 2322
时间循环加倍:: 1510
long
比double
需要更长的时间,我拥有64 bit window operating
系统和64 bit Java
。当我修改代码并将
casting
long
和double
添加到int
时,就像public static void main(String[] args) {
long j = 1000000000;
double k = 1000000000;
long t1 = System.currentTimeMillis();
for (int index = 0; index < (int)j; index++) {
}
long t2 = System.currentTimeMillis();
for (int index = 0; index < (int)k; index++) {
}
long t3 = System.currentTimeMillis();
long longTime = t2 - t1;
long doubleTime = t3 - t2;
System.out.println("Time to loop long :: " + longTime);
System.out.println("Time to loop double :: " + doubleTime);
}
时间虽然减少了,但时间上还是有差异的,但是这次双倍花费的时间比长得多(与第一种情况相反)
输出:
时间长循环:: 760
时间循环加倍:: 1030
最佳答案
首先,long
是64位整数,而double
是64位浮点数。时序差异可能是由于CPU的ALU中的整数算法和浮点算法之间的优化差异所致。
其次,第二次运行应用程序时,在每个for循环中,循环每次都会评估停止条件,因此,每次迭代时,您都将long和double分别转换为整数。如果在循环的条件之前将值预铸为整数值,则应该获得更一致的时间:
int j_int = (int) j;
for(int index = 0; index < j_int; index++) { /* Body */ }
int k_int = (int) k;
for(int index = 0; index < k_int; index++) { /* Body */ }
关于java - 是时候使用long和double循环了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32943728/