虽然可能存在类似的问题(例如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中,如何以编程方式测量执行时间开销?
答案 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),直到开始合理的经过时间。