您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
Swift,任道而重远!
 
作者 伍昆 来源:CSDN  火龙果软件  发布于 2014-12-17
   次浏览      
 

苹果公司对外宣称,性能是Swift带给OS X和iOS开发人员的好处之一。然而,独立开发者Tyrone执行的基准测试显示,与Objective-C相比,Swift性能并不如人意。

在今年的 WWDC 2014大会上,苹果公司发布了Swift。Swift语言不仅继承了C语言以及Objective-C的特性,而且还克服了C语言的兼容性问题,对于广大开发者来说是个不错的选择。然而,原文作者Tyrone却并不待见Swift,他在使用Swift的过程中,发现Swift并没有想象中的美好。究竟是什么原因呢?一起来看下:

译文如下:

 在进行测试前,我作了如下思考:

  • 诚然Swift在对数组进行排序时候获得了与C相媲美的优异表现,但是其它方面呢?
  • 可能是出于市场营销的效率,苹果给出的标签是比Objective-C快2.6倍、比Python2.7 快8.4倍,真的吗?
  • 它有个优美的名字Swift(雨燕),轻盈迅捷,但我们不能沉迷于表象。

我这里主要以一个Swift项目为基础,进行性能测试。以下是一个相关示例代码:

这是一个用于分析500KB大小JSON数据的示例,完整的示例代码请点击这里进行下载,示例处理的问题是在1000个会话中找出用户User对应的会员身份。解析器parser读取JSON后,创建Membership对象并指向关联实例User和Convo ,同时根据convos键值创建(或更新)Convo对象堆。

我利用了XCTest的新特性进行了性能测试。测试代码如下所示:

我在编译设置中开启了-O模式,测试的设备是第五代iPod Touch,运行的系统是iOS 8,使用的是与iPhone4S相同的A5双核处理器。随着JSON数据处理量的增加,该设备的响应越来越慢。

测试结果是用时1.42s,多么令人吃惊的龟速。于是,我决定马上创建一个Objective-C版本来进行对比。

同样地我启用了-Os。令人惊喜的是,这个版本的运行用时仅需0.09s,换而言之,它大约比Swift快了将近15倍,而我在Swift和Object-C都已经开启了LLVM优化器。

我尝试对Swift的反常表现进行简单研究,我暂时还不能确定这究竟是Swift本身的原因还是JSONHelpder引起的。唯一的方法是一行行地比照Objective-C语句和Swift语句,再写另一个Objective-C样式的Swift,然后进行Apples To Apples的测试。这或许不是常规的Swift写法,随处都是NSDictionary引用而不是Swift 本身的函数。例如:

Swift在-O下运行时会有segfaults(段错误)的情况,为了公平起见,我把Object-C优化器关闭了,这是关闭后两者的比较:

  • Objective-C:0.06s
  • Objective-C样式的Swift:0.29s

让我较迷惑的是Objective-C在关闭优化器后反而运行得更快,这个先放下,不是这次的重点。由上可见,Objective-C样式的Swift获得了可接受的性能表现,但是如果真的这样做,段错误会不断出现,最后导致性能下降。

出于好奇,最后我还使用了RubyMotion以Ruby语言重写Objective-C测试。RubyMotion支持使用Ruby来编写iOS 和安卓应用,程序最后会被编译为相同的机器码,与Swift和Objective-C过程类似。一直以来,我认为Ruby会比Objective-C慢得多,毕竟这是动态和静态语言的区别。

该Ruby示例代码如下:

注:RubyMotion中暂时没有任何的优化设置选项。

最后的测试结果是:

可见,RubyMotion比Swift跑得更快。因此,Swift是不是真的如宣传所说的那样身手敏捷,真的见仁见智了。不过对于我来说,如果没有进一步的改进,我决定还是使用Objective-C来编写iOS项目好了。

以下是笔者摘取的部分精彩观点:

来自DemonicEgg的评论: 

“本文做了和我差不多的测试,只是没有使用一些第三方库。我发现当我把全部类型转为使用Swift Array<>和Dictionary<>时,我发现更为惊吓的后果,比Objective-C慢了差不多47倍。” 

来自aeturnum的评论: 

“JSON解释速度或许还不算最差的性能指标。只不过面对新语言时,留给开发组用来测试的时间预算会有多少呢?所以稳定的Objective-C还是首选。”

来自 vital_chaos的评论: 

“我们不应该抹杀新事物。难道小baby一出生就会驾驶?所有语言都是经过千锤百炼才有今天的成就的。性能权且可以作为一个参考而不是全部。 

   
次浏览       
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
最新活动计划
LLM大模型应用与项目构建 12-26[特惠]
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
业务建模&领域驱动设计 11-15[北京]
用户研究与用户建模 11-21[北京]
SysML和EA进行系统设计建模 11-28[北京]

android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   

Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...