2013-04-22 11 views
5

私は最終年度のプロジェクトで深刻な問題があります。私はPhoneGapを使っていくつかのプラットフォームをサポートするモバイルアプリを開発するように言われました。その後、私はPhoneGapネイティブのパフォーマンスを比較するように言われたので、私はアンドロイドでそれをテストすることにしました。Phonegapとネイティブアンドロイドのパフォーマンステスト

私はネイティブのAndroidためのJavaサンプル関数を書き、ためはJavaScriptでそれを達成するための時間を測定しPhoneGapのインチそして面白いのは、JavaScript関数が時間を要していることです。私はネイティブ関数の方がずっと速いと思っていました。

ここで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での私のコード:最初の1のための

  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番目のものは:3600ms平均で

私はサムスンギャラクシー

にテストしてい

は10.1タブレットに注意してください。

これは正しいですか?あるいは私は何かを逃して重大な間違いを犯していますか?

ありがとうございました。

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

ランダムはr =新しい

を入れた後、 Random()

ループ外では、ループを実行するのに必要な新しい時間は750msです。しかし、Phonegapの速度は依然として2倍速く、数値処理のためにはPhonegapよりも優れています.NativeはAndroidでですか?

+2

を試してみて、パフォーマンスを比較することで、このような簡単なテストは、重大な間違いです。あなたは、数学的に集中的な仕事やグラフィックスの仕事をしなければなりません。 –

+4

すべての反復で新しいRandomオブジェクトをインスタンス化せず、for -loopの外側で ''新しいRandom() ''を移動した場合、それでも有効な比較はできますか? – harism

+0

両方のポイントが有効です。各行が実行された後に故障が発生するはずです... @ harism pointが実際にネイティブにランタイムを大幅にダウンさせると思われます。 – brendosthoughts

答えて

1

すべての乱数ジェネレータが等しく機能するわけではありません。公正な比較のためには、決定論的な計算を行う方が良いでしょう。

テストには、GUI応答時間のテスト、ネットワーク接続、データベースアクセスなどのその他の機能も含める必要があります。最も興味深いのは、ほとんどのアプリケーションがほとんどの時間を費やすためです。他のすべての比較は、コード内のマイクロ最適化を探すようなものです。

本当に私がこの質問に訪れた理由は、結果を共有してください。ここで

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)); 
    } 
} 
} 
関連する問題