阅读更多

0顶
1踩

编程语言

原创新闻 Swift,任道而重远!

2014-12-16 10:39 by 正式编辑 cao345657340 评论(1) 有7659人浏览
摘要:苹果公司对外宣称,性能是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项目为基础,进行性能测试。以下是一个相关示例代码:
import Foundation  
  
public class User : ModelObject, UpdatableFromJSON {  
    public var name: String?  
    public var handle: String?  
  
    public required init(data: [String : AnyObject]) {  
        super.init(data: data)  
        updateWithJSON(data)  
    }  
  
    public override func updateWithJSON(data: [String : AnyObject]) {  
        super.updateWithJSON(data)  
        name <<< data["name"]  
        handle <<< data["handle"]  
    }  
}  

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

我利用了XCTest的新特性进行了性能测试。测试代码如下所示:
func testUserConvosSwiftParsingPerformance() {  
    let filePath = NSBundle(forClass: PerformanceTests.self).pathForResource("convos", ofType: "json")  
    let jsonData = NSData(contentsOfFile: filePath!)  
    var error: NSError?  
    let jsonObject = NSJSONSerialization.JSONObjectWithData(jsonData!, options: nil, error: &error)! as [String : AnyObject]  
    self.measureBlock() {  
        let resp = ChatspryClient.UserConvosResponse(data: jsonObject)  
    }  
}

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

测试结果是用时1.42s,多么令人吃惊的龟速。于是,我决定马上创建一个Objective-C版本来进行对比。
@interface CSUser : CSModelObject  
@property (nonatomic, strong) NSString *name;  
@property (nonatomic, strong) NSString *handle;  
@end  
@implementation CSUser  
- (void) updateWithJSON:(NSDictionary *)json  
{  
    [super updateWithJSON: json];  
    self.name = json[@"name"];  
    self.handle = json[@"handle"];  
}  
@end  

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

我尝试对Swift的反常表现进行简单研究,我暂时还不能确定这究竟是Swift本身的原因还是JSONHelpder引起的。唯一的方法是一行行地比照Objective-C语句和Swift语句,再写另一个Objective-C样式的Swift,然后进行Apples To Apples的测试。这或许不是常规的Swift写法,随处都是NSDictionary引用而不是Swift 本身的函数。例如:
public class CSSwiftUser : CSSwiftModelObject {  
    public var name: String?  
    public var handle: String?  
  
    public override func updateWithJSON(json: NSDictionary) {  
        super.updateWithJSON(json)  
        name = json["name"] as String?  
        handle = json["handle"] as String?  
    }  
}  

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示例代码如下:
class CSUser < CSModelObject  
  attr_accessor :name, :handle  
  
  def updateWithJSON(json)  
    super  
    self.name = json[:name]  
    self.handle = json[:handle]  
  end  
end  

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

最后的测试结果是:




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

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


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


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


原文出自:Sudeium
  • 大小: 49.8 KB
来自: CSDN
0
1
评论 共 1 条 请登录后发表评论
1 楼 mangguo 2014-12-16 15:46

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • CSDN前1000名博主

    最近的你, 是我最远的爱 … 中国 云南省 昆明市 迷途小羊羔 cometwo 排名:38 原创:3031 粉丝:758 积分:73768 等级:9 黄沙百战穿金甲,不破楼兰终不还。 -------&gt;生无所息 行胜于言 中国 北京 ...

  • 推荐CSDN排名前1000博主

    有了目标,我们才会把注意力集中在追求喜悦,而不是在避免痛苦上。… 北京 朝阳区 技术真好! Ejnstein 排名:30 原创:3583 粉丝:329 积分:82363 等级:9   ...

  • 《上海堡垒》究竟几何?让我用爬虫一探究竟

    科幻我不懂,我平时更偏好言情线,电影里,少年人半仰慕半暗恋的情绪表达得非常到位,渺小和求而不得也处理得很好,可以说,《上海堡垒》原著的精髓,电影是抓到了。再说演员,舒淇美得像琉璃,指挥官的坚强和女性的...

  • 100项PPT制作技术,做出让观众倾倒的演示文档!

    为了获得好的效果,人们通常会在幻灯片中使用一些非常漂亮的字体,可是将幻灯片拷贝到演示现场进行播放时,这些字体变成了普通字体,甚至还因字体而导致格式变得不整齐,严重影响演示效果。 在powerpoint中,...

  • 贴出最新整理的英语谚语大全(3267条)

    爱挑的担子不嫌重。 27. A burnt child dreads the fire. 一朝被蛇咬,十年怕井绳。 28. A candle lights others and consumes itself. 蜡烛照亮别人毁灭了自己。 29. A cat has 9 lives. 猫有九条命。 30. A cat ...

  • Flutter 不是真正的跨平台框架

    转自:英文:Luke Urban,翻译:CSDN月初,Google 重磅发布了专为 Web、移动和桌面而构建的 Flutter 2!将 Flutter 从移动开发框架扩展成可移植框架,因而...

  • 英语词汇表

    而 anecdote n. 逸事 anger n. 怒,愤怒 angle n. 角,角度 angry a. 生气的,愤怒的 animal n. 动物 ankle n. 踝关节 anniversary n. 周年纪念 announce vt. 宣布,宣告 annoy vt. (使)烦恼 annual a. 每年的;...

  • 编辑语言发展历史

    人类第一台 电 子 计 算 机,即“埃 尼 阿 克(ENIAC)” 问世于1946年,由大量的电子管组成,用 于 进 行 弹 道 计算。自埃尼阿克的面世以后,电子计算机经历了电子管 - 晶 体 管 - 集 成 电 路 - 超大...

  • 编程语言的发展历史和未来展望

    人类第一台 电 子 计 算 机,即“埃 尼 阿 克(ENIAC)” 问世于1946年,由大量的电子管组成,用 于 进 行 弹 道 计算。自埃尼阿克的面世以后,电子计算机经历了电子管 - 晶 体 管 - 集 成 电 路 - 超大...

  • 扉页

    目前,以比特币和以太坊为代表的公有链相对比较成熟,而私有链和联盟链则远远不够成熟。开源而且好用的联盟链,更是不存在。目前全球影响力最大的开源联盟 链,是Linux基金会下面的超级账本(Hyperledger)项目,...

  • 区块链技术

    第一次听说这个问题居然是在TCP的课上,大致说的是有两个相距很远的军队要传递信息,红军派遣一个信使去跟蓝军说:“你他娘的把意大利炮拿出来!”。蓝军收到信息后又派了一个信使去红军说:“收到指令!”。然后...

  • GPU深度报告,三大巨头,十四个国内玩家一文看懂【物联网智商精选】

    Metal也是可以使用Swift或Objective-C编程语言调用的面向对象的API。GPU的全部操作是通过Metal着色语言控制的。 2017年,苹果推出了Metal的升级版Metal2,兼容前代Metal硬件,支持iOS11,MacOS和tvOS11。Metal2可以...

  • OpenStack

    OpenStackd开源项目由社区维护,包括OpenStack计算(代号为Nova),OpenStack对象存储(代号为Swift),并OpenStack镜像服务(代号Glance)的集合。 OpenStack提供了一个操作平台,或工具包,用于编排云。 OpenStack...

  • “UNIX的名字是我起的”——对话UNIX开发者Brian W. Kernighan

    自1969年在贝尔实验室的阁楼中诞生以来,UNIX的发展远远超出了创造者们的想象。它带动了许多创新软件的开发,影响了无数程序员,如果没有它,Linux、macOS和Android系统可能不会存在,人们依赖的导航软件、智能家电...

  • node-v12.20.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

  • 基于Springboot+Vue的乡政府管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

  • 一名合格的程序猿修炼手册.md

    一名合格的程序猿修炼手册.

  • 5MHz 函数发生器使用说明书

    5MHz 函数发生器使用说明书

  • 99- 矿山工业互联网平台解决方案.pptx

    99- 矿山工业互联网平台解决方案.pptx

Global site tag (gtag.js) - Google Analytics