5

我的最后一年的项目有一个严重的问题。我被告知要使用PhoneGap开发一个移动应用程序来支持多个平台。然后我被告知要比较PhoneGapNative的性能,所以我决定在 android 上进行测试。

我编写了一个示例函数,并测量了在JavaScript for PhoneGapJava for Native Android中实现它的时间。有趣的是,JavaScript 函数的完成时间缩短了10倍,而且我一直认为 Native 函数要快得多。

这是我在 JavaScript 中用于 PhoneGap 的代码:

        var array = new Array();
        var start = new Date().getTime();
            for (var i = 0; i < 1000000; i++) {
                var j = i + Math.random();
                if (j % 2 == 0)
                    j = 1;
                else
                    j = 0;
                array.push(j);
            }
            var end = new Date().getTime();

            var time = end-start;
            var div = document.getElementById('result');

            div.innerHTML = "Result time= " + time;

我在 Java 中的 Native 代码:

            long startTime = System.currentTimeMillis();
            ArrayList<Integer> array = new ArrayList<Integer>();
            for (int i = 0; i < 1000000; i++) {
                Random r = new Random();
                int j = i + r.nextInt();
                if (j % 2 == 0)
                    j = 1;
                else
                    j = 0;
                array.add(j);
            }
            long endTime = System.currentTimeMillis();

            long time = endTime - startTime;
            t1.setTextColor(Color.BLACK);
            t1.setText("Result time= "
                    + Long.toString(time));

第一个的输出是:平均350 毫秒

第二个的输出是:平均3600ms

我正在测试

三星 Galaxy Note 10.1 平板电脑。

这是正确的吗?还是我错过了什么并犯了严重的错误?

非常感谢你的帮助。

- - - - - - - 更新 - - - - - - -

放好后

随机 r = 新随机()

在循环之外,执行循环所需的新时间是750ms。但是使用Phonegap 速度仍然是两倍快,我可以得出结论,对于数值处理,Phonegap比Android 上的Native更好吗?

4

2 回答 2

1

并非所有随机数生成器的性能都一样。为了公平比较,您最好进行确定性计算。

您的测试还应包括其他功能,例如测试 GUI 响应时间、网络、数据库访问等。最有趣的是 GUI 响应时间,因为这是大多数应用程序花费大部分时间的地方。所有其他比较就像在代码中寻找微优化一样。

请分享您的结果,因为这就是我访问这个问题的真正原因。

于 2013-06-10T19:06:39.060 回答
0

来,试试这个

package com.zeroblitz.benchmark1;
import java.util.ArrayList;
import java.util.Random;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
private TextView tvTest1;
private TextView tvTest2;
private Button btnStart;
private int v[]=new int[1000000];
private Random random=new Random(System.currentTimeMillis());
private int n_v=0;
private ArrayList<Integer> array=new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initViews();
}
private void initViews(){
    tvTest1=(TextView)findViewById(R.id.tvTest1);
    tvTest2=(TextView)findViewById(R.id.tvTest2);
    btnStart=(Button)findViewById(R.id.btnStart);

    btnStart.setOnClickListener(startButtonListener);
}
OnClickListener startButtonListener=new OnClickListener() {
    public void onClick(View v) {
        new AsyncTest1(tvTest1).execute();
    }
};

public class AsyncTest1 extends AsyncTask<Void, Void, Void>{
    private TextView tv;
    long time=0;
    public AsyncTest1(TextView tv){
        this.tv=tv;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        tv.setText("Testing 1 ....");
    }
    protected Void doInBackground(Void... params) {
        n_v=0;
        long start=System.currentTimeMillis();
        for(int i=0;i<1000000;i++)
            v[n_v++]=1-(i+random.nextInt())%2;
        time=System.currentTimeMillis()-start;
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        tv.setText(String.format("Test 1 = %.3f", time/1000.f));
        new AsyncTest2(tvTest2).execute();
    }
}
public class AsyncTest2 extends AsyncTask<Void, Void, Void>{
    private TextView tv;
    long time=0;
    public AsyncTest2(TextView tv){
        this.tv=tv;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        tv.setText("Testing 2 ....");
    }
    protected Void doInBackground(Void... params) {
        //n_v=0;
        array.clear();
        array.trimToSize();
        long start=System.currentTimeMillis();
        for(int i=0;i<1000000;i++){
            //int j=i+random.nextInt();
            int j=i+new Random().nextInt();
            if(j%2==0)j=1;
            else j=0;
            array.add(j);
        }
            //array.add(1-(i+random.nextInt())%2);
        time=System.currentTimeMillis()-start;
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        tv.setText(String.format("Test 2 = %.3f", time/1000.f));
    }
}
}
于 2014-01-06T17:15:00.447 回答