使用 long 和 double 循环的时间

Time to loop using long and 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);
    }

输出:

Time to loop long :: 2322

Time to loop double :: 1510

longdouble 花费的时间更长,我有 64 bit window operating 系统和 64 bit Java.

当我修改我的代码并添加 casting longdoubleint 就像

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 更简单。

原因是 longint 都是整数,并且在内存中仅通过二进制表示形式表示(可能还有一位用于符号)。 只需 "cropping" 或 "extending" 内存区域(并正确处理符号)即可从一个转换为另一个非常简单。

然而,doublefloating point numbers,它们的二进制表示有点复杂,使用符号、尾数和指数。 因此,从此处转换为整数更加复杂,因为它需要先从一种二进制格式转换为另一种二进制格式。