我遇到Xamarin声称他们在Android上的Mono实现和他们的C#编译应用程序比Java代码更快.有没有人在不同的AndroID平台上对非常相似的Java和C#代码执行实际基准来验证此类声明,是否可以发布代码和结果?
2013年6月18日新增
由于没有答案,也找不到其他人做的基准,所以决定自己做测试.不幸的是,我的问题仍然是“锁定”,所以我不能将其作为答案发布,只编辑问题.请投票重新打开这个问题.对于C#,我使用了Xamarin.AndroID Ver. 4.7.09001(测试版).源代码,我用于测试和编译的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个不同设备和一个模拟器的总时间.我只测试了“Release”版本,没有启用调试.
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速度.
在英特尔模拟器上(使用英特尔HAX技术,模拟器以快速模式运行),Xamarin C#代码比Java快得多地运行我的示例代码 – 大约快了1.35倍.也许Mono虚拟机代码和库在英特尔上比在ARM上更优化?
编辑2013年7月8日
我刚刚安装了在Oracle VirtualBox中运行的Genymotion AndroID模拟器,而且这个模拟器再次使用原生英特尔处理器,而不是模拟ARM处理器.与英特尔HAX仿真器一样,C#再次在这里运行得更快.这是我的结果:
Genymotion模拟器 – 英特尔(AndroID 4.1.1,API 16)
Java:
Grand total time (5 runs): 2069 ms, with file reading total: 2248 msC#:
Grand total time (5 runs): 1543 ms, with file reading total: 1642 ms
然后我注意到Xamarin.AndroID beta版本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好吗?决定在我的galaxy Note 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更长,即使Note 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的速度,禁用了省电模式:
Java的:
总计时间(5次运行):3292 ms,文件读数总计:3454 ms
原生拇指:
总计时间(5次运行):537 ms,文件读取总计:657 ms
本土手臂:
总计时间(5次运行):458 ms,文件读数总计:587 ms
看起来对于我的特定测试,本机代码比Java快6到7倍.警告:无法在AndroID上使用std :: regex类,因此必须编写我自己的专用例程来搜索段落符号或HTML标记.我在使用正则表达式的PC上对相同代码的初始测试比Java快4到5倍.
唷!再次使用char *或wchar *指针唤醒原始内存,我立即觉得年轻20岁! 总结
以上是内存溢出为你收集整理的有没有人比较用Xamarin C#和Java编写的Android应用程序的性能基准(代码和结果)?全部内容,希望文章能够帮你解决有没有人比较用Xamarin C#和Java编写的Android应用程序的性能基准(代码和结果)?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)