在android性能测试中,Phonegap vs native

时间:2013-04-22 20:44:45

标签: java javascript android cordova native

我的最后一年项目存在严重问题。我被告知使用 PhoneGap 开发移动应用程序以支持多个平台。然后我被告知比较 PhoneGap Native 的表现,所以我决定在android上测试它。

我编写了一个示例函数并测量了 JavaScript PhoneGap Java <中的实现时间原生Android 的/ em> 。有趣的是,JavaScript函数的完成时间缩短了 10 ,而且我认为Native函数要快得多。

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

        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 for 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));

第一个的输出是: 350ms 平均

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

我正在测试

  

三星Galaxy Note 10.1平板电脑。

这是对的吗?或者我错过了什么并犯了一个严重的错误?

非常感谢你的帮助。

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

之后

  

随机r = new Random()

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

2 个答案:

答案 0 :(得分:1)

并非所有随机数生成器都具有相同的性能。为了公平比较,你最好做一个确定性的计算。

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

请分享您的结果,因为这才是我访问此问题的原因。

答案 1 :(得分: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));
    }
}
}