在Android中,如何以编程方式衡量执行时间开销?

时间:2016-01-18 20:30:31

标签: java android performance compiler-optimization dalvik

虽然可能存在类似的问题(例如A),但他们的答案并不能解决我的问题。

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

我有一个改进的Android,它增加了内存空间开销(由作者专门设计,并且超出了本问题的范围),使用了任何已使用的变量。例如,如果我们声明一个整数变量,变量将以8个字节(64位)而不是4个字节(32位)存储。此修改对于可以在修改过的Android上运行且没有任何问题的应用程序完全透明。

我需要测量执行时间的开销,例如,当我使用变量时。

这是我到目前为止所做的,但它似乎不起作用,因为开销变量(在下面的代码中的方法#1的末尾)是不一致的,有时它是负的,正的或零。在理想的解决方案中,它应始终(或至少在大多数情况下)为正。

      long start, end, time1, time2, overhead;

    //Baseline
    start = System.nanoTime();
    total=0; total+=1; total+=2; total+=3; total+=4; total+=5; total+=6;
    total+=7; total+=8; total+=9;
    end = System.nanoTime();
    System.out.println("********************* The sum is " + total);
    time1 =  end - start;
    System.out.println("********************* start=" + start + " end=" + end + " time=" + time1);

    //Method #1
    start = System.nanoTime();
    total = (a0() + a1() + a2() + a3() + a4() + a5() + a6() + a7() + a8() + a9());
    end = System.nanoTime();
    System.out.println("********************* The sum is " + total);
    time2 =  end - start;
    System.out.println("********************* start=" + start + " end=" + end + " time=" + time2);

    overhead = time2 - time1;
    System.out.println("********************* overhead=" + overhead );    
}
private int a0()
{
    return 0;
}
private int a1()
{
    return 1;
}
private int a2()
{
    return 2;
}
private int a3()
{
    return 3;
}
private int a4()
{
    return 4;
}
private int a5()
{
    return 5;
}
private int a6()
{
    return 6;
}
private int a7()
{
    return 7;
}
private int a8()
{
    return 8;
}
private int a9()
{
    return 9;
}

我的问题是:

在Android中,如何以编程方式测量执行时间开销?

2 个答案:

答案 0 :(得分:0)

您所描述的只是实验性错误。

  

开销变量不一致,有时它是负数,   积极的,或零。在理想的解决方案中,它应始终(或在   最少的大部分时间都是积极的。

我在Android上没有针对您问题的确切解决方案,但是当我在其他环境中进行实验测试时,我通常会运行多次迭代,然后除以迭代次数以获得平均值。

这是一些伪代码:

int N = 10000;

startTimer();
for (int i = 0; i < N; i++) {
  runExperiment();
}
stopTimer();

double averageRuntime = timer / N;

答案 1 :(得分:0)

问题是您尝试计时的代码执行速度比System.nanotime()的分辨率快。尝试在循环中进行添加,例如

for (int i = 0; i < 1000; i++) {
    total += i;
}

增加循环次数(1000),直到开始合理的经过时间。