为什么PhoneGap似乎比Titanium更快?

3

我正在尝试测量一些跨平台解决方案的执行性能,其中包括:Titanium和PhoneGap。

这是我的性能测试器的 Titanium 版本示例,非常简单,但我只是想了解我的代码执行速度有多快:

var looplength;
var start1;
var start2;
var end1;
var end2;
var duration1;
var duration2;
var diff;
var diffpiter;
var power;
var info;

for (power = 0; power < 24; power++) {
  looplength = Math.pow(2, power);

  start1 = new Date().getTime();
  for (iterator = 0; iterator < looplength; iterator++) {a=iterator;b=iterator;}
  end1 = new Date().getTime();

  start2 = new Date().getTime();
  for (iterator = 0; iterator < looplength; iterator++) {a=iterator;}
  end2 = new Date().getTime();

  duration1 = end1 - start1;
  duration2 = end2 - start2;
  diff      = duration1 - duration2;
  diffpiter = diff / looplength;

  info={title:'2^' + power + ' ' + diffpiter};
  tableView.appendRow(Ti.UI.createTableViewRow(info),{animated:true});
}

电话盖版本相同,除了最后两行需要替换。
document.write('2^' + power + ' ' + diffpiter + '<br />');

这两个版本都在 iPhone 4S 上运行。我已经多次运行测试,以消除误差。

天哪,为什么 Titanium 版本的迭代时间大约是~0.0009毫秒,而 PhoneGap 版本的迭代时间却只有 ~0.0002 毫秒?

我期望 Titanium 可以编译我的 JavaScript 代码,因此我认为它会更快。然而,在这种情况下,它至少慢了 4倍!虽然我不是性能测试专家,但我设计的测试应该至少是准确的...

谢谢您提供的任何提示。


Titanium和PhoneGap具有显著不同的用例。做这样的微基准测试完全是错失了重点。 - ceejayoz
我明白,但我将在应用程序中放置任何业务逻辑都将使用纯JavaScript完成。因此,我正在测试纯JavaScript在这些情况下运行的速度。我理解人们会出于不同的原因使用Titanium和PhoneGap,但我试图向自己说明Titanium会执行得更快。 - pancake
4个回答

7
钛金并不会将JavaScript代码转换为Objective-C。钛金只是使用JavaScript到Objective-C的桥接来与Objective-C iOS框架进行通信(最重要的是用户界面对象)。更合适的比较应该是编写钛金的用户界面元素(按钮、标签、窗口、视图),对它们进行操作,并在Phonegap中使用HTML、CSS和图像按钮。
Phonegap也使用自己的桥接,如果你懂Java或Objective-C,你可以制作插件来使用iOS或Android的本地用户界面元素和其他本地功能。 http://zsprawl.com/iOS/2012/05/navigation-bar-with-nativecontrols-in-cordova/ 是一个关于在Cordova中使用本地控件的导航栏的例子。

3
这是基本的JavaScript,不是所有的JavaScript都编译成本地代码。基本上当您使用Titanium API时,它会转换为Objective-C或Java代码。但为了灵活和动态,APP中编译了一个JavaScript解释器,它可以运行您编写的JavaScript代码。
这使得应用程序变慢。但是仅在这些方面进行测试是没有意义的。如果您想要进行全面的测试套件,您需要使用Titanium API,并将其与PhoneGap相比较。
您会注意到,由于Phonegap没有编译成本地代码,它会感觉不同,而Titanium在视觉上会表现得更快。

我只是想试试在PhoneGap和Titanium环境中运行相同的纯JavaScript代码的速度。其他差异(例如原生UI和Titanium API公开的其他区域)在这个层面上是无法比较的,我同意这一点。 - pancake

2

噢,伙计,我不想引发争论,但我会发表我的意见。首先,完全透明:我是PhoneGap的贡献者,从未使用过Titanium。然而,我是在15年的开发经验中回答的。

我从来没有发现将代码从一种语言转换为另一种语言的工具特别高效。是的,本地代码应该比JavaScript代码运行得更快,但我敢打赌,在翻译阶段中引入了低效性。

再次强调,这只是从过去使用将一种语言编译成另一种语言的工具的经验中得出的结论,这并不是针对Titanium的批评,因为那是一个很棒的框架。


1
在你的Titanium代码中,你的最后一行创建了UI对象 - 这是调用Objective-C创建UITableViewRow和动画对象,然后将其附加到UITableView - 你正在执行3个操作。我非常有信心这就是花费时间的原因。Ti的首选方法是创建一个标题对象数组,然后在最后使用setData设置表格数据。
PhoneGap已经在应用程序加载时创建了UIWebView,你只需更新一个DOM元素中的HTML,所以我希望UI会更快。

有趣的理论,但我不明白它是如何工作的。时间测量代码仅包围循环,而不是 Ti.UI 代码。或者假设我的代码按顺序执行也是错误的吗?如果是这种情况,那么所有的赌注都是无效的。 我刚刚进行了测试,将 tableView.appendRow() 替换为对数组的 Array.push() 操作,并在最后执行 tableView.setData()。没有加速。 - pancake
抱歉 - 我错了。我以为你在主循环上运行测试。现在我看到你是在主循环内运行循环并在那里进行测试。 - Jeff Bonnes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接