swift,任道而重远! -九游会j9官网ag登录入口

0顶
1踩

swift,任道而重远!

2014-12-16 10:39 by 正式编辑 cao345657340 评论(1) 有7594人浏览
摘要:苹果公司对外宣称,性能是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获得了可接受的性能表现,但是如果真的这样做,段错误会不断出现,最后导致性能下降。

出于好奇,最后我还使用了以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中暂时没有任何的优化设置选项。

最后的测试结果是:




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

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


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


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


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

发表评论

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

相关推荐

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

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

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

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

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

  • 转自:英文: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的课上,大致说的是有两个相距很远的军队要传递信息,红军派遣一个信使去跟蓝军说:“你他娘的把意大利炮拿出来!”。蓝军收到信息后又派了一个信使去红军说:“收到指令!”。然后...

  • metal也是可以使用swift或objective-c编程语言调用的面向对象的api。gpu的全部操作是通过metal着色语言控制的。 2017年,苹果推出了metal的升级版metal2,兼容前代metal硬件,支持ios11,macos和tvos11。metal2可以...

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

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

  • vb语言vb光盘管理系统设计(源代码 系统)本资源系百度网盘分享地址

  • h型脚架疲劳测试机sw16可编辑_零件图_机械工程图_机械三维3d建模图打包下载.zip

  • 笔记.zip

  • python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。python社区提供了大量的第三方库,如numpy、pandas和requests,极大地丰富了python的应用领域,从数据科学到web开发。python库的丰富性是python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,matplotlib和seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

  • python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。python社区提供了大量的第三方库,如numpy、pandas和requests,极大地丰富了python的应用领域,从数据科学到web开发。python库的丰富性是python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,matplotlib和seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

global site tag (gtag.js) - google analytics
网站地图