2013-04-22 9 views
5

Mam poważny problem z moim ostatnim projektem roku. Powiedziano mi, aby opracować aplikację mobilną, korzystając z usługi PhoneGap do obsługi wielu platform. Potem powiedziano mi, aby porównać występy PhoneGap vs Native, więc zdecydowałem się przetestować go na Androida.Phonegap kontra rodzimy na androidowym teście wydajności

pisałem przykładową funkcję i mierzy czas, aby go osiągnąć w JavaScript dla PhoneGap aw Java dla Native Androida. Zabawne jest to, że funkcja JavaScript zajmuje razy mniej czasu do zakończenia i przez cały czas myślałem, że funkcje natywne są dużo szybsze.

Oto mój kod w JavaScript dla 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; 

A mój kod w Javie dla 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)); 

wyjścia dla pierwszego jest: 350ms średnio

Output dla drugiego jest: 3600ms średnio

ja testuje na

Samsung Galaxy Note 10.1 tabletki.

Czy to prawda? Czy może czegoś brakuje i popełniam poważny błąd?

Bardzo dziękuję za pomoc.

-------------- Aktualizacja --------------

po umieszczeniu

losową R = new random()

poza pętlą nowego czasu wymaga, aby wykonać pętla jest 750ms. Ale z Phonegapem prędkość jest jeszcze dwukrotnie szybsza, czy mogę stwierdzić, że do obróbki numerycznej, Phonegap jest lepszy niż Natywny na Androida?

+2

Running tylko jeden test, a taki prosty test na to, aby porównać wydajność jest poważnym błędem. Powinieneś wykonywać * bardzo * zadania wymagające intensywnej matematyki lub zadania graficzne. –

+4

Czy nadal będzie to poprawne porównanie, jeśli nie tworzysz nowego obiektu losowego w każdej iteracji, ale przestawiasz '' new Random() '' poza opcją for -loop? – harism

+0

Oba punkty są poprawne powinieneś mieć podział po wykonaniu każdego wiersza ... Podejrzewam, że @ punkt zaczepienia faktycznie doprowadziłby czas działania do natywnego w dół znacząco – brendosthoughts

Odpowiedz

1

Nie wszystkie generatory liczb losowych wykonują jednakowo. Dla uczciwego porównania lepiej byłoby zrobić kalkulację deterministyczną.

Twoje testy powinny również obejmować inne funkcje, takie jak testowanie czasów odpowiedzi GUI, sieci, dostęp do baz danych itp. Najciekawsze będą czasy odpowiedzi interfejsu GUI, ponieważ w tym przypadku większość aplikacji spędza większość czasu. Wszystkie inne porównania byłyby jak szukanie mikrooptymalizacji w kodzie.

Proszę udostępniać wyniki, ponieważ to właśnie dlatego odwiedziłem to pytanie.

0

Tu, spróbuj tego

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)); 
    } 
} 
} 
Powiązane problemy