5

最終年度のプロジェクトで重大な問題があります。複数のプラットフォームをサポートするために、 PhoneGapを使用してモバイル アプリを開発するように言われました。次に、 PhoneGapNativeのパフォーマンスを比較するように言われたので、android でテストすることにしました。

サンプル関数を書いて、PhoneGap用のJavaScriptネイティブ Android 用Javaでそれを達成する時間を測定しました。そして面白いことに、JavaScript 関数は完了するまでに10分の 1 の時間がかかっており、ずっとネイティブ関数の方がずっと速いと思っていました。

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での私のコード:

            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

2 番目の出力:平均3600 ミリ秒

私はテストしています

Samsung Galaxy Note 10.1 タブレット。

これは正しいですか?それとも、何かを見逃していて、重大な間違いを犯していますか?

助けてくれてどうもありがとう。

- - - - - - - アップデート - - - - - - -

入れた後

ランダム r = 新しいランダム()

ループの外側では、ループの実行に必要な新しい時間は750msです。しかし、Phonegap を使用すると、速度は依然として 2 倍速くなります。数値処理に関して、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 に答える