使用 long 和 double 循环的时间
Time to loop using long and double
下面这段代码是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);
}
输出:
Time to loop long :: 2322
Time to loop double :: 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 花费的时间比 long 多(与第一种情况相反)
输出:
Time to loop long :: 760
Time to loop double :: 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
都是整数,并且在内存中仅通过二进制表示形式表示(可能还有一位用于符号)。
只需 "cropping" 或 "extending" 内存区域(并正确处理符号)即可从一个转换为另一个非常简单。
然而,double
是 floating point numbers,它们的二进制表示有点复杂,使用符号、尾数和指数。
因此,从此处转换为整数更加复杂,因为它需要先从一种二进制格式转换为另一种二进制格式。
下面这段代码是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);
}
输出:
Time to loop long :: 2322
Time to loop double :: 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 花费的时间比 long 多(与第一种情况相反)
输出:
Time to loop long :: 760
Time to loop double :: 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
都是整数,并且在内存中仅通过二进制表示形式表示(可能还有一位用于符号)。
只需 "cropping" 或 "extending" 内存区域(并正确处理符号)即可从一个转换为另一个非常简单。
然而,double
是 floating point numbers,它们的二进制表示有点复杂,使用符号、尾数和指数。
因此,从此处转换为整数更加复杂,因为它需要先从一种二进制格式转换为另一种二进制格式。