阅读更多

0顶
1踩

编程语言

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

2014-12-16 10:39 by 正式编辑 cao345657340 评论(1) 有7669人浏览
摘要:苹果公司对外宣称,性能是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系统可能不会存在,人们依赖的导航软件、智能家电...

  • 安装NumPy教程-详细版

    附件是安装NumPy教程_详细版,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

  • 语音端点检测及其在Matlab中的实现.zip

    语音端点检测及其在Matlab中的实现.zip

  • C#文档打印程序Demo

    使用C#完成一般文档的打印,带有页眉,页脚文档打印,表格打印,打印预览等

  • DirectX修复工具-4-194985.zip

    directx修复工具 DirectX修复工具(DirectX repair)是系统DirectX组件修复工具,DirectX修复工具主要是用于检测当前系统的DirectX状态,若发现异常情况就可以马上进行修复,非常快捷,使用效果也非常好。

  • Python手动实现人脸识别算法

    人脸识别的主要算法 其核心算法是 欧式距离算法使用该算法计算两张脸的面部特征差异,一般在0.6 以下都可以被认为是同一张脸 人脸识别的主要步骤 1 获得人脸图片 2 将人脸图片转为128D的矩阵(这个也就是人脸特征的一种数字化表现) 3 保存人脸128D的特征到文件中 4 获取其他人脸转为128D特征通过欧式距离算法与我们保存的特征对比,如果差距在0.6以下就说明两张脸差距比较小

Global site tag (gtag.js) - Google Analytics