在XAMARIN C和Java编写的Android应用程序的性能是否有基准(代码和结果)比较?

Does anyone have benchmarks (code & results) comparing performance of Android apps written in Xamarin C# and Java?

我发现Xamarin声称他们在Android和他们的C编译的应用程序上的单声道实现比Java代码快。在不同的Android平台上,是否有人对非常相似的Java和C代码执行实际的基准测试,以验证这些要求,可以发布代码和结果吗?

2013年6月18日增补

由于没有答案,也找不到其他人做的基准,所以决定自己做测试。不幸的是,我的问题仍然是"锁定"的,因此我不能将此作为答案发布,只能编辑问题。请投票重新打开这个问题。对于C,我使用了xamarin.android版本。4.7.09001(β)。源代码、我用于测试和编译APK包的所有数据都在Github上:

Java:HTTPS://GITHUBCOM/GRGKO/TSSETUPUBJAVA

C:https://github.com/gregko/ttssetup_c_sharp

如果有人想在其他设备或模拟器上重复我的测试,我也会有兴趣了解结果。

我的测试结果

我将句子提取器类移植到C(来自@voice auloud reader应用程序),并对10个HTML文件(英语、俄语、法语、波兰语和捷克语)进行了一些测试。在所有10个文件上执行了5次每次运行,下面发布了3个不同设备和一个模拟器的总时间。我只测试了"发布"版本,没有启用调试。

HTC Nexus One Android 2.3.7(API 10)-氰基元模式只读存储器

Java:总计时间(5次运行):12361毫秒,文件读取总数:13304毫秒

C:总计时间(5次运行):17504 ms,文件读取总计:17956 ms

三星Galaxy s2 SGH-I777(Android 4.0.4,API 15)-氰基mod ROM

Java:总计时间(5次运行):8947毫秒,文件读取总数:9186毫秒

C:总计时间(5次运行):9884 ms,文件读取总计:10247 ms

三星GT-N7100(Android 4.1.1 Jellybean,API 16)-三星ROM

Java:总计时间(5次运行):9742毫秒,文件读取总数:10111毫秒

C:总计时间(5次运行):10459 ms,文件读取总计:10696 ms

Emulator-Intel(Android 4.2,API 17)

Java:总计时间(5次运行):2699毫秒,文件读取总数:3127毫秒

C:总计时间(5次运行):2049 ms,文件读取总计:2182 ms

Emulator-Intel(Android 2.3.7,API 10)

Java:总计时间(5次运行):2992毫秒,文件读取总数:3591毫秒

C:总计时间(5次运行):2049 ms,文件读取总计:2257 ms

Emulator-ARM(Android 4.0.4,API 15)

Java:总计时间(5次运行):41751毫秒,文件读取总数:43866毫秒

C:总计时间(5次运行):44136 ms,文件读取总计:45109 ms

简要讨论

我的测试代码主要包含文本解析、替换和regex搜索,对于其他代码(例如更多的数字操作),结果可能会有所不同。在所有具有ARM处理器的设备上,Java都比XAMARIN C代码更好。最大的差异是在Android 2.3下,其中C代码的运行速度约为Java速度的70%。

在英特尔仿真器上(用英特尔HAX技术,仿真器运行在快速VILT模式),XAMARIN C代码的运行代码比Java快得多,大约快了1.35倍。也许单虚拟机代码和库在Intel上比在ARM上优化得更好?

编辑2013年7月8日

我刚刚安装了genymotion android模拟器,它在Oracle virtualbox中运行,而且这一个使用本机Intel处理器,而不是模仿ARM处理器。与Intel Hax Emulator一样,C_在这里运行得更快。以下是我的结果:

Genymotion Emulator-Intel(Android 4.1.1,API 16)

Java:
Grand total time (5 runs): 2069 ms, with file reading total: 2248 ms

C#:
Grand total time (5 runs): 1543 ms, with file reading total: 1642 ms

然后我注意到Xamarin.android测试版4.7.11有了更新,发行说明也提到了Mono运行时的一些变化。决定快速测试一些ARM设备,大大提高了C数字:

bn nook xd+,ARM(Android 4.0)

Java: Grand total time (5 runs): 8103 ms, with file reading total: 8569 ms

C#: Grand total time (5 runs): 7951 ms, with file reading total: 8161 ms

真的!C现在比Java好吗?决定在我的星系注2上重复测试:

三星Galaxy Note 2-ARM(Android 4.1.1)

Java: Grand total time (5 runs): 9675 ms, with file reading total: 10028 ms

C#: Grand total time (5 runs): 9911 ms, with file reading total: 10104 ms

这里c似乎只是稍微慢一点,但这些数字让我停顿了一下:为什么时间比Nook HD+长,即使注2的处理器更快?答案是:省电模式。在Nook,它被禁用,在注2-启用。决定在禁用省电模式的情况下进行测试(与启用时一样,它还限制处理器速度):

三星Galaxy Note 2-ARM(Android 4.1.1),禁用节能功能

Java: Grand total time (5 runs): 7153 ms, with file reading total: 7459 ms

C#: Grand total time (5 runs): 6906 ms, with file reading total: 7070 ms

现在,令人惊讶的是,C语言比ARM处理器上的Java稍微快一些。大进步!

编辑2013年7月12日

我们都知道,没有什么比本地代码更快,而且我不满意Java或C语言中的句子分割器的性能,特别是我需要改进它(从而使它变得更慢)。决定重新编写它在C++中。这里是一个小的(也就是比以前的测试更小的一组文件,因为其他原因),比较我的Galaxy Note 2上的原生对Java的速度。


是的,Xamarin的单虚拟机比谷歌在Android中使用的Dalvik更令人印象深刻。我已经用HTC FLIER和宏碁ICONICATIAL平板电脑测试了它,通过JavaDalvik的单声道对Android的C端口进行了测试,用Android的C实现实现了真正的基于Java的Dalvik。


1
I came across this interesting post

https://medium.com/@harrycheung/mobile-app-performance-redux-e512be94f976.kfbauchtz

Android App Performance

iOS App Performance

希望这些信息有帮助。


这是另一篇更新的博客文章,我想和你分享。他将Xamarin与iOS和Android上的原生代码和Cordova进行了比较。

简而言之,Xamarin有时比本机代码执行得更好。他测试了应用程序的大小、加载时间、从Azure服务加载列表和质数计算。

享受!

编辑:我更新了死链接,发现有第2部分


我们最近调查了使用Xamarin的应用程序。我们使用了已经为我们的应用程序的Windows RT版本编写的C代码。一些特定的细节必须为Android版本重写。

我们发现XAMARIN C中的I/O比Java慢约2X。我们的应用程序严重受I/O限制。我们还没有发现造成这种情况的原因,但目前我们假设这是由于编组造成的。虽然我们大部分时间都试图呆在mono虚拟机中,但我们不知道mono实际上是如何访问磁盘的。

它还告诉我们,我们的C代码使用sqlite.net(https://github.com/praeclarum/sqlite net)。使用SQLite .NET代码的相同获取速度也比使用Android的Java SQLite包装器慢2X。在查看了源代码之后,它似乎直接绑定到c.dll,所以我不知道为什么它会慢得多。一种可能是,在XAMARIN上,从原生到Java的字符串封送可能比Android上的原生到C的更快。


以下是我在本机、Xamarin和Xamarin之间的另一个测试中发现的一些信息。以下两个设备上的表单解决方案(测试还包括iOS性能):

三星Galaxy A7:Android操作系统版本:6.0中央处理单元:八核1.9GHz Cortex-A53内存:3GB显示分辨率:1920×1080

iPhone 6S:iOS版本:10.3.3中央处理单元:双核1.84GHz捻线机RAM:2 GB显示分辨率:1334×750

比较了几个常见的特性,每个特性都有自己的应用:

1
2
3
4
5
- Basic"Hello World"
- REST API
- JSON Serialization/Deserialization
- Photo Loading
- SQL Database Insert and Get All

每个测试都要重复几次,图表显示了平均结果。

你好世界

Basic Hellow World performance comparison

REST API

一组测试旨在测量应用程序通过RESTAPI发送请求和接收响应所需的时间,而无需进一步的数据处理,使用OpenWeathermapAPI。

Rest API performance comparison

JSON操作使用newtonsoft json.net框架对所有xamarin应用程序中的json对象进行序列化和反序列化的测试。使用两个Java库:杰克逊和GSON测试本机Android序列化和反序列化。

进行了两次运行,第一次是从头开始运行,第二次是使用缓存的信息和操作运行。

第一次运行:

JSON serialization first run

JSON deserialization first run

(原生iOS JSON操作正在杀死这个测试BTW,而XAMARIN在第二个测试中加入它)

JSON Serialization second run

JSON Deserialization second run

照片操作

首先加载具有三种不同分辨率的图像:

1
2
3
Resolution – 858×569, Size – 868Kb
Resolution – 2575×1709, Size – 8Mb
Resolution – 4291×2848, Size – 28.9Mb

Image First Load Android

Image First Load iOS

关于Xamarin,似乎有一些不确定的地方。形成了这个测试的结果,所以它不包含在图表中。

sqlite操作

测试了两个操作:

1
2
BulkInsert: Loading rows of data into a database table.
GetAll: Retrieving all data from the database.

数据库有10000条记录。所有操作都在设备上进行了内部处理。

SQLite Android performances

SQLite iOS performances

Xamarin native(xamarin.ios/xamarin.android)显示自己是本机代码的相当好的替代品,而xamarin.forms在很多情况下似乎很慢,但它可以是一个非常好的解决方案来快速开发真正简单的应用程序。

完整测试来自以下来源:

Performance Comparison: Xamarin.Forms, Xamarin.iOS, Xamarin.Android vs Android and iOS Native Applications

谢谢你给我解释,以加强我的回答,希望这有点帮助:)


性能

性能是一个模糊的词,如果您不定义性能的含义,如果它是简单的计算性能,XAMARIN可以比Java更快,这取决于计算的性质。

Android Nativly提供了多个表单来执行以下代码:

  • renderscript(CPU和GPU)
  • Java(SDK)
  • C++(NDK)
  • OpenGL(GPU)

很明显,当执行代码时,解决方案的本地性越高,速度就越快。基于运行时的语言永远不会胜过直接在CPU上运行的语言。

但另一方面,如果你想测量现实生活中的使用性能,Java将会比XAMARIN更快。

Xamarin和为什么会慢一点

当将XAMARIN与普通的Java应用程序进行比较时,XAMARIN的性能可能会更快,因为它可能会较慢。

在现实世界中,XAMARIN应用程序很可能比Java应用程序慢,因为许多Android /Java(系统)调用需要使用所谓绑定来向XAMARIN运行时和从XAMARIN运行时委托。

有几种不同类型的绑定需要了解:

  • JNI(Java本机接口):在许多Android应用程序中使用的绑定,用于在Java代码(SDK)和本机C++代码(NDK)之间进行接口。
  • MCW(管理的可调用包装器):一种在Xamarin可用的绑定,用于从托管C代码到Java代码(Android运行时)的接口。
  • ACW(Android可调用包装器):一种在Xamarin可用的绑定,用于从Java代码(Android运行时)到托管C代码的接口。

More on MCW and ACW here: https://developer.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/part_1_-_understanding_the_xamarin_mobile_platform/

绑定的性能非常昂贵。从Java中调用C++方法在调用时间上增加了巨大的开销,从C++中调用C++方法的速度是很多很多倍。

Someone did a performance test to calculate how many Java operations on average a JNI call costs: What is the quantitative overhead of making a JNI call?

但不仅JNI呼叫成本高昂,MCW和ACW之间的呼叫成本也很高。现实世界XAMARIN应用程序使用绑定进行许多调用,并且由于这个现实世界XAMARIN应用程序的使用(一般来说)会比普通的Java应用程序慢。但是,根据Xamarin应用程序的设计方式,用户很可能不会注意到这种差异。

TLDR/结论:Xamarin需要使用al-sorts绑定,这需要花费大量的时间。

Besides bindings, there are many other factors involved when talking about real-world performance, for example: size of the binary, loading the app in memory, I/O operations and many more. A blog post that investigates some of these things can be found here: https://magenic.com/thinking/mobile-development-platform-performance-part-2-native-cordova-classic-xamarin-xamarin-forms


这是一个相当古老的测试,但可能是相关的:https://github.com/egorbo/xamarin.android-vs-java

算术测试

enter image description here

集合、泛型、自定义值类型

enter image description here

使用字符串

enter image description here

upd:GooglePixel2的新数据(谢谢你的分享)

Pixel 2 tests