下面的代码使用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);
    }


时间虽然减少了,但时间上还是有差异的,但是这次双倍花费的时间比长得多(与第一种情况相反)

输出:


  时间长循环:: 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 */ }

关于java - 是时候使用long和double循环了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32943728/

10-10 14:32
查看更多