2013-04-22 70 views
5

我的最后一年项目存在严重问题。我被告知开发一款使用PhoneGap的移动应用程序来支持多种平台。然后我被告知比较PhoneGap的本机的性能,所以我决定在android上测试它。Phonegap vs android on android性能测试

我写了一个样本函数和测量的时间来实现它在的JavaScript的PhoneGap的Java机Android。而有趣的是,JavaScript函数花费的时间更少,我一直认为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代码中的本机:

  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上的原生

+2

只运行一个测试,在这样一个简单的测试,比较性能是一个严重的错误。你应该做一些*非常*数学密集型任务或图形任务。 – 2013-04-22 20:46:48

+4

如果你没有在每次迭代中实例化新的Random对象,而是在for -loop之外移动“new Random()”,它仍然是有效的比较吗? – harism 2013-04-22 20:47:18

+0

这两点都是有效的,你应该在每一行执行后有一个故障...我会怀疑@ harism点确实会使运行时间显着下降 – brendosthoughts 2013-04-22 20:49:40

回答

1

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

您的测试还应该包括其他功能,例如测试GUI响应时间,网络连接,数据库访问等。最有趣的将是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)); 
    } 
} 
}