使用long和double循环的时间



下面这段代码是对longdouble采取不同的计时,不明白为什么会有计时上的差异?

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

longdouble耗时长,我有64 bit window operating系统和64 bit Java系统。

当我修改代码并将casting longdouble添加到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要简单。

原因是longint都是整数,并且在内存中仅用它们的二进制表示(可能还有一位符号)。从一个转换到另一个非常简单,只需"裁剪"或"扩展"内存区域(并正确处理符号)。

然而,double是浮点数,它们的二进制表示有点复杂,使用符号,尾数和指数。因此,从这里转换为整数更复杂,因为它需要首先从一种二进制格式转换为另一种。

最新更新