有人有基准(代码和结果)比较用Xamarin C#和Java编写的Android应用程序的性能?

问题:

我遇到了Xamarin声称,他们在Android上的Mono实现和他们的C#编译的应用程序比Java代码更快。有没有人在不同的Android平台上执行非常相似的Java和C#代码的实际基准来验证这样的声明,可以发布代码和结果?

于2013年6月18日新增

既然没有答案,也找不到别人做的这样的基准,决定做自己的测试。不幸的是,我的问题仍然是“锁定”,所以我不能将其作为答案发布,只能编辑问题。请投票重新打开这个问题。对于C#,我使用Xamarin.Android ver。 4.7.09001(beta)。源代码,我用于测试的所有数据和编译的APK包都在GitHub上:
Java:https://github.com/gregko/TtsSetup_Java
C#:https://github.com/gregko/TtsSetup_C_sharp
如果有人想在其他设备或仿真器上重复测试,我也有兴趣了解结果。

我测试结果

我将我的句子提取器类移植到C#(从我的@Voice Aloud Reader应用程序),并以10种html文件的英文,俄语,法语,波兰语和捷克语进行一些测试。每个运行在所有10个文件上执行5次,并且下面发布3个不同设备和一个仿真器的总时间。我测试了“版本”版本,不启用调试。

HTC Nexus One Android 2.3.7(API 10) – CyanogenMod ROM

Java:总计时间(5次):12361 ms,文件读取总数:13304 ms
C#:总计时间(5次):17504 ms,文件读取总数:17956 ms

三星Galaxy S2 SGH-I777(Android 4.0.4,API 15) – CyanogenMod ROM

Java:总计时间(5次):8947 ms,文件读取总数:9186 ms
C#:总计时间(5次):9884 ms,文件读取总数:10247 ms

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

Java:总计时间(5次):9742 ms,文件读取总数:10111 ms
C#:总计时间(5次):10459 ms,文件读取总数:10696 ms

模拟器 – 英特尔(Android 4.2,API 17)

Java:总计时间(5次):2699 ms,文件读取总数:3127 ms
C#:总计时间(5次):2049 ms,文件读取总数:2182 ms

模拟器 – 英特尔(Android 2.3.7,API 10)

Java:总计时间(5次):2992 ms,文件读取总数:3591 ms
C#:总时间(5次):2049 ms,文件读取总数:2257 ms

模拟器 – 手臂(Android 4.0.4,API 15)

Java:总计时间(5次):41751 ms,文件读取总数:43866 ms
C#:总计时间(5次):44136 ms,文件读取总数:45109 ms

简要讨论

我的测试代码主要包含文本解析,替换和正则表达式搜索,也许对于其他代码(例如更多数字操作),结果将不同。在具有ARM处理器的所有设备上,Java表现优于Xamarin C#代码。最大的区别是Android 2.3,其中C#代码运行在大约70%的Java速度。
在英特尔模拟器(采用Intel HAX技术的仿真器运行速度很快)中,Xamarin C#代码运行我的示例代码比Java快得多 – 大约1.35倍。可能Mono虚拟机代码和库在Intel上优于ARM?

编辑2013年7月8日

我刚刚安装了Genymotion Android模拟器,它在Oracle VirtualBox中运行,并且再次使用本地Intel处理器,而不是仿真ARM处理器。与Intel HAX仿真器一样,C#再次运行速度更快。这是我的结果:

Genymotion仿真器 – Intel(Android 4.1.1,API 16)

Java:总计时间(5次):2069 ms,文件读取总数:2248 ms
C#:总时间(5次):1543 ms,文件读取总数:1642 ms

然后我注意到有一个更新到Xamarin.Android beta版本4.7.11,发行说明提到Mono运行时的一些变化。决定快速测试一些ARM设备,大惊小怪 – C#数字改进:

BN Nook XD +,ARM(Android 4.0)

Java:总共时间(5次运行):8103 ms,文件读取总数:8569 ms
C#:总计时间(5次):7951 ms,文件读取总数:8161 ms

哇! C#现在比Java好吗?决定在我的Galaxy Note 2上重复测试:

三星Galaxy Note 2 – ARM(Android 4.1.1)

Java:总计时间(5次):9675 ms,文件读取总数:10028 ms
C#:总时间(5次):9911 ms,文件读取总数:10104 ms

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

三星Galaxy Note 2 – ARM(Android 4.1.1),省电禁用

Java:总计时间(5次):7153 ms,文件读取总数:7459 ms
C#:总计时间(5次):6906 ms,文件读取总数:7070 ms

现在,令人惊讶的是,C#比ARM处理器上的Java要快一些。大改善!

编辑2013年7月12日

我们都知道,没有什么比本地代码更快的速度,我对Java或C#中的句子分割器的性能不满意,特别是我需要改进它(从而使它更慢)。决定用C ++重写。这是一个小的(即比以前的测试更小的一组文件,由于其他原因)比较我的Galaxy Note 2上的本机和Java的速度,禁用了省电模式:
Java的:
总计时间(5次):3292 ms,文件读取总数:3454 ms
本地拇指:
总计时间(5次):537 ms,文件读取总数:657 ms
本机:
总时间(5次):458 ms,文件读取总数:587 ms
看起来像我的特定测试,本机代码比Java快6到7倍。注意事项:无法在Android上使用std :: regex类,所以不得不编写我自己的专用例程来搜索段落break或html标签。我使用正则表达式在PC上对相同代码的初步测试比Java快了大约4到5倍。
唷!用char *或wchar *指针再次唤醒原始记忆,我立即感到20岁! 🙂

编辑2013年7月15日

 (Please see below, with edits of 7/30/2013, for much better results with Dot42)

回答:

是的,Xamarin的Mono虚拟机比Google的Dalvik在Android中更加令人印象深刻。我已经使用HTC Flyer和Acer Iconia Tab平板测试它,以通过Mono对Java Dalvik对Android的C#端口进行基准测试,安卓的C#实现,真正地摧毁了基于Java的Dalvik。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Does anyone have benchmarks (code & results) comparing performance of Android apps written in Xamarin C# and Java?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

75 − 74 =