以下代码与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
答案 0 :(得分:3)
首先,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 */ }
答案 1 :(得分:2)
一般情况下,从long
到int
的投射比从double
到int
更简单。
原因是long
和int
都是整数,并且仅通过它们的二进制表示(并且可能是符号的一位)在存储器中表示。
通过&#34;裁剪&#34;从一个到另一个的铸造是非常简单的。或者&#34;延伸&#34;记忆区域(并正确处理标志)。
然而,double
是floating point numbers,他们的二进制表示更复杂,使用符号,尾数和指数。
因此,从这里到整数的转换更复杂,因为它需要从一种二进制格式转换到另一种二进制格式。