使用long和double循环的时间

时间:2015-10-05 07:55:28

标签: java loops primitive

以下代码与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

long花费的时间比double更长,我有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

2 个答案:

答案 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)

一般情况下,从longint的投射比从doubleint更简单。

原因是longint都是整数,并且仅通过它们的二进制表示(并且可能是符号的一位)在存储器中表示。 通过&#34;裁剪&#34;从一个到另一个的铸造是非常简单的。或者&#34;延伸&#34;记忆区域(并正确处理标志)。

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