我的最后一年项目存在严重问题。我被告知使用 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 吗?
答案 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));
}
}
}