下面这段代码是对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);
}
时间减少了,但在计时上仍然存在差异,但是这次double花费的时间比长(与第一种情况相反)
输出:循环时间::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 */ }
一般来说,从long
转换到int
比从double
转换到int
要简单。
原因是long
和int
都是整数,并且在内存中仅用它们的二进制表示(可能还有一位符号)。从一个转换到另一个非常简单,只需"裁剪"或"扩展"内存区域(并正确处理符号)。
然而,double
是浮点数,它们的二进制表示有点复杂,使用符号,尾数和指数。因此,从这里转换为整数更复杂,因为它需要首先从一种二进制格式转换为另一种。