在Android中,如何以编程方式测量执行时间开销?
In Android, how to measure the execution time overhead programmatically?
虽然可能会有类似的问题(比如A),但是他们的回答并没有解决我的问题。
我正在使用 Android Studio 1.5.1 目标 Android API 18(在 Android KitKat 4.4 之前,所以我正在处理 Dalvik,而不是 ART 运行时间).
我有一个修改过的 Android 增加了内存 space 开销(作者专门设计的,它不在这个问题的范围内)和任何使用的变量。例如,如果我们声明一个整数变量,该变量将以 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 中,如何以编程方式测量执行时间开销?
您所描述的只是实验误差。
the overhead variable is inconsistent, sometime it is negative,
positive, or zero. In the ideal solution, it should be always (or at
least most of the time) positive.
我没有针对 Android 问题的确切解决方案,但是当我在其他情况下进行实验测试时,我通常会 运行 多次迭代,然后除以迭代以获得平均值。
这是一些伪代码:
int N = 10000;
startTimer();
for (int i = 0; i < N; i++) {
runExperiment();
}
stopTimer();
double averageRuntime = timer / N;
问题是您尝试计时的代码执行速度比 System.nanotime()
的分辨率快。尝试在循环中进行添加,例如
for (int i = 0; i < 1000; i++) {
total += i;
}
增加循环计数 (1000),直到您开始获得合理的运行时间。
虽然可能会有类似的问题(比如A),但是他们的回答并没有解决我的问题。
我正在使用 Android Studio 1.5.1 目标 Android API 18(在 Android KitKat 4.4 之前,所以我正在处理 Dalvik,而不是 ART 运行时间).
我有一个修改过的 Android 增加了内存 space 开销(作者专门设计的,它不在这个问题的范围内)和任何使用的变量。例如,如果我们声明一个整数变量,该变量将以 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 中,如何以编程方式测量执行时间开销?
您所描述的只是实验误差。
the overhead variable is inconsistent, sometime it is negative, positive, or zero. In the ideal solution, it should be always (or at least most of the time) positive.
我没有针对 Android 问题的确切解决方案,但是当我在其他情况下进行实验测试时,我通常会 运行 多次迭代,然后除以迭代以获得平均值。
这是一些伪代码:
int N = 10000;
startTimer();
for (int i = 0; i < N; i++) {
runExperiment();
}
stopTimer();
double averageRuntime = timer / N;
问题是您尝试计时的代码执行速度比 System.nanotime()
的分辨率快。尝试在循环中进行添加,例如
for (int i = 0; i < 1000; i++) {
total += i;
}
增加循环计数 (1000),直到您开始获得合理的运行时间。