Was*_*ker 8 java android performance-testing
我最近开始阅读基准测试并为Android编写它们(用Java编写).我知道像热身,垃圾收集器和编译器优化这样的问题,但不知道我面临的问题是否可能是由任何问题引起的.
在我的基准测试应用程序中,我创建了一个包含10,000个浮点变量的数组,并使用随机值对其进 运行基准代码时:
private void runMinorBenchmarkFloat (float[] array) {
float sum = 0;
long startTime;
long endTime;
/* Fast warm-up */
startTime = System.nanoTime();
for(int i=0; i<SMALL_LOOP_ITERATION_COUNT; i++)
for(int j=0; j<TAB_SIZE; j++)
sum += array[j];
endTime = System.nanoTime() - startTime;
postMessage("Warm-up for FLOAT finished in: " + endTime/1000000 + "ms.\n");
/* Main benchmark loop */
startTime = System.nanoTime();
for(int i=0; i<BIG_LOOP_ITERATION_COUNT; i++)
{
sum = 0;
for(int j=0; j<TAB_SIZE; j++)
sum += array[j];
}
endTime = System.nanoTime() - startTime;
postMessage("Benchmark for FLOAT finished in: " + endTime/1000000 + "ms.\n");
postMessage("Final value: " + sum + "\n\n");
}
Run Code Online (Sandbox Code Playgroud)
在我的手机上,我得到大约2秒的热身和20秒的"真实"循环.
现在,当我添加两个浮点变量(sum2和sum3 - 从未在方法中使用)时:
private void runMinorBenchmarkFloat (float[] array) {
float sum = 0, sum2 = 0, sum3 = 0; // <------- the only code change here!!!
long startTime;
long endTime;
/* Fast warm-up */
startTime = System.nanoTime();
for(int i=0; i<SMALL_LOOP_ITERATION_COUNT; i++)
for(int j=0; j<TAB_SIZE; j++)
sum += array[j];
endTime = System.nanoTime() - startTime;
postMessage("Warm-up for FLOAT finished in: " + endTime/1000000 + "ms.\n");
/* Main benchmark loop */
startTime = System.nanoTime();
for(int i=0; i<BIG_LOOP_ITERATION_COUNT; i++)
{
sum = 0;
for(int j=0; j<TAB_SIZE; j++)
sum += array[j];
}
endTime = System.nanoTime() - startTime;
postMessage("Benchmark for FLOAT finished in: " + endTime/1000000 + "ms.\n");
postMessage("Final value: " + sum + "\n\n");
}
Run Code Online (Sandbox Code Playgroud)
执行时间从2秒升温到5秒,从20秒跳到真正循环到50秒.
常数:
SMALL_LOOP_ITERATION_COUNT = 100,000
BIG_LOOP_ITERATION_COUNT = 1,000,000
Run Code Online (Sandbox Code Playgroud)
你认为这种差异可能是由对齐问题造成的(只是松散的想法)?
提前感谢您的任何答案.
编辑:
似乎每个设备上都没有出现此错误.我可以在三星Galaxy S5上重现它.该计划的主要目标是制定一些基准.我做了四个几乎相同的函数(runMinorBenchmark____,其中_是:int,short,float,double),它们只在变量'sum'类型中有所不同.在主要的基准测试函数中,我调用了这些函数.因为发生了上述错误,我决定将这些功能合并为一个大功能.现在......在运行测试时我有这样的时间:1.37640ms.(对于int)2.46728ms.(简称)3. 60589ms.(浮动)4.34467ms.(双倍)
我知道,由于类型转换,short意味着更慢.我还认为,如果将其转换为double,浮动应该更慢(可能FPU每次都会将类型转换加倍(?)).但是当我将sumFloat的变量类型从float更改为double时,float的时间与double时间相同.我也在另一台设备上做了这个"基准",似乎没有遭受这种奇怪的行为,每次测试的时间几乎相同:~45000ms.(真的没有明显的差异).
Dalvik VM错误(?)
我不相信这是你遇到麻烦的原因。编译器肯定会丢弃那些未使用的变量吗?您确定输入数组或您的常量不会改变吗TAB_SIZE?
如果您仍然确定,请通过运行类似的操作并将输出粘贴到此处来证明这一点:
public void proveIt() {
float[] inputArray = new float[10000];
for (int i = 0; i < 10000; i++) {
inputArray[i] = 1;
}
postMessage("Without declaration:");
runMinorBenchmarkFloatA(inputArray);
postMessage("With declaration:");
runMinorBenchmarkFloatB(inputArray);
postMessage("And again just to make sure...");
postMessage("Without declaration:");
runMinorBenchmarkFloatA(inputArray);
postMessage("With declaration:");
runMinorBenchmarkFloatB(inputArray);
}
long TAB_SIZE = 10000;
long SMALL_LOOP_ITERATION_COUNT = 100000;
long BIG_LOOP_ITERATION_COUNT = 1000000;
private void runMinorBenchmarkFloatA(float[] array) {
float sum = 0;
long startTime;
long endTime;
/* Fast warm-up */
startTime = System.nanoTime();
for (int i = 0; i < SMALL_LOOP_ITERATION_COUNT; i++)
for (int j = 0; j < TAB_SIZE; j++)
sum += array[j];
endTime = System.nanoTime() - startTime;
postMessage("Warm-up for FLOAT finished in: " + endTime
/ 1000000 + "ms.\n");
/* Main benchmark loop */
startTime = System.nanoTime();
for (int i = 0; i < BIG_LOOP_ITERATION_COUNT; i++) {
sum = 0;
for (int j = 0; j < TAB_SIZE; j++)
sum += array[j];
}
endTime = System.nanoTime() - startTime;
postMessage("Benchmark for FLOAT finished in: " + endTime
/ 1000000 + "ms.\n");
postMessage("Final value: " + sum + "\n\n");
}
private void runMinorBenchmarkFloatB(float[] array) {
float sum = 0, sum2 = 0, sum3 = 0;
long startTime;
long endTime;
/* Fast warm-up */
startTime = System.nanoTime();
for (int i = 0; i < SMALL_LOOP_ITERATION_COUNT; i++)
for (int j = 0; j < TAB_SIZE; j++)
sum += array[j];
endTime = System.nanoTime() - startTime;
postMessage("Warm-up for FLOAT finished in: " + endTime
/ 1000000 + "ms.\n");
/* Main benchmark loop */
startTime = System.nanoTime();
for (int i = 0; i < BIG_LOOP_ITERATION_COUNT; i++) {
sum = 0;
for (int j = 0; j < TAB_SIZE; j++)
sum += array[j];
}
endTime = System.nanoTime() - startTime;
postMessage("Benchmark for FLOAT finished in: " + endTime
/ 1000000 + "ms.\n");
postMessage("Final value: " + sum + "\n\n");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |