在Android中,为什么第一个添加代码比第二个添加代码慢?

时间:2016-01-10 10:13:55

标签: java android performance dalvik

我使用Android Studio 1.5.1定位Android API 18(在Android KitKat 4.4之前,所以我正在处理Dalvik,而不是ART运行时)。

似乎当我在不使用变量的情况下添加10个整数并再次使用变量添加相同的数字时,无论是否使用变量,第一个代码总是慢于第二个代码。

例如,在下面的代码中:

第一个代码,用// ****第一个代码****标记,在不使用变量的情况下添加10个整数,而第二个代码用// ****第二个代码** **,添加相同的10个整数但它使用10个变量。

与不使用变量的变量相比,不应该使用变量减慢代码执行速度吗?

此外,如果我交换代码,如果我将// ****第二个代码****移到// ****第一个代码****之上,// ****秒代码****现在变得慢于// ****第一个代码****。

我的问题是:

为什么第一个代码总是慢于第二个代码,无论它是否使用变量?

long start, end, elapsed;

    //****First code****

    start = System.nanoTime();
    System.out.printf("The sum is %d\n", (0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9));
    end = System.nanoTime();
    elapsed =  end - start;
    System.out.println("start=" + start + " end=" + end + " elapsed=" + elapsed);

    //****Second code****

    start = System.nanoTime();
    int     a0=0,
            a1=1,
            a2=2,
            a3=3,
            a4=4,
            a5=5,
            a6=6,
            a7=7,
            a8=8,
            a9=9;

    a1 += a0;
    a2 += a1;
    a3 += a2;
    a4 += a3;
    a5 += a4;
    a6 += a5;
    a7 += a6;
    a8 += a7;
    a9 += a8;

    System.out.printf("The sum is %d\n", a9);
    end = System.nanoTime();
    elapsed =   end - start;
    System.out.println("start="+start + " end="+end +" elapsed="+elapsed);

1 个答案:

答案 0 :(得分:1)

你正在计算在printf上花费的时间。这应该给出更类似的结果。虽然线程可能随时进入休眠状态,但不保证它是相同的。此外,在第一种情况下,它将被转换为常量,因此它不会真正做任何数学运算。

long start = System.nanoTime();

//this will be converted to a constant of 45 at compile time
int total = (0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9);
long end = System.nanoTime();

System.out.printf("The sum is %d\n", total);
System.out.println("Time: " + (end - start));

start = System.nanoTime();
int a0=0,
    a1=1,
    a2=2,
    a3=3,
    a4=4,
    a5=5,
    a6=6,
    a7=7,
    a8=8,
    a9=9;
total = a0;
total += a1;
total += a2;
total += a3;
total += a4;
total += a5;
total += a6;
total += a7;
total += a8;
total += a9;
end = System.nanoTime();

System.out.printf("The sum is %d\n", total);
System.out.println("Time: " + (end - start));