日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift,任重而道远!

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift,任重而道远! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Swift,任重而道遠!

發表于2014-12-16 08:35| 8232次閱讀| 來源CSDN| 57 條評論| 作者伍昆

AppleSwiftObjective-C性能測試 width="22" height="16" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2014-12-15%2F2823135-Swift&type=3&count=&appkey=&title=%E8%8B%B9%E6%9E%9C%E5%85%AC%E5%8F%B8%E5%AF%B9%E5%A4%96%E5%AE%A3%E7%A7%B0%EF%BC%8C%E6%80%A7%E8%83%BD%E6%98%AFSwift%E5%B8%A6%E7%BB%99OS%20X%E5%92%8CiOS%E5%BC%80%E5%8F%91%E4%BA%BA%E5%91%98%E7%9A%84%E5%A5%BD%E5%A4%84%E4%B9%8B%E4%B8%80%E3%80%82%E7%84%B6%E8%80%8C%EF%BC%8C%E7%8B%AC%E7%AB%8B%E5%BC%80%E5%8F%91%E8%80%85Tyrone%E6%89%A7%E8%A1%8C%E7%9A%84%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95%E6%98%BE%E7%A4%BA%EF%BC%8C%E4%B8%8EObjective-C%E7%9B%B8%E6%AF%94%EF%BC%8CSwift%E6%80%A7%E8%83%BD%E5%B9%B6%E4%B8%8D%E5%A6%82%E4%BA%BA%E6%84%8F%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1461112340624" frameborder="0" scrolling="no" allowtransparency="true">摘要:蘋果公司對外宣稱,性能是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項目為基礎,進行性能測試。以下是一個相關示例代碼:

[js] view plaincopyprint?
  • 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"]??
  • ????}??
  • }??
  • import Foundationpublic 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的新特性進行了性能測試。測試代碼如下所示:

    [js] view plaincopyprint?
  • 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)??
  • ????}??
  • }??
  • 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版本來進行對比。

    [js] view plaincopyprint?
  • @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??
  • @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 本身的函數。例如:

    [js] view plaincopyprint?
  • 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???
  • ????}??
  • }??
  • 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示例代碼如下:

    [js] view plaincopyprint?
  • class?CSUser?<?CSModelObject??
  • ??attr_accessor?:name,?:handle??
  • ??
  • ??def?updateWithJSON(json)??
  • ????super??
  • ????self.name?=?json[:name]??
  • ????self.handle?=?json[:handle]??
  • ??end??
  • end??
  • class CSUser < CSModelObjectattr_accessor :name, :handledef updateWithJSON(json)superself.name = json[:name]self.handle = json[:handle]end end

    注:RubyMotion中暫時沒有任何的優化設置選項。

    最后的測試結果是:


    可見,RubyMotion比Swift跑得更快。因此,Swift是不是真的如宣傳所說的那樣身手敏捷,真的見仁見智了。不過對于我來說,如果沒有進一步的改進,我決定還是使用Objective-C來編寫iOS項目好了。


    以下是筆者摘取的部分精彩觀點:

    來自 DemonicEgg的評論:

    “本文做了和我差不多的測試,只是沒有使用一些第三方庫。我發現當我把全部類型轉為使用Swift?Array<>和Dictionary<>時,我發現更為驚嚇的后果,比Objective-C慢了差不多47倍?!?

    來自 aeturnum的評論:

    “JSON解釋速度或許還不算最差的性能指標。只不過面對新語言時,留給開發組用來測試的時間預算會有多少呢?所以穩定的Objective-C還是首選。”

    來自 vital_chaos的評論:

    “我們不應該抹殺新事物。難道小baby一出生就會駕駛?所有語言都是經過千錘百煉才有今天的成就的。性能權且可以作為一個參考而不是全部。?

    原文出自:Sudeium

    (責編/夏夢竹)

    更多精彩內容,敬請關注CSDN研發頻道微博,一起來暢聊。

    總結

    以上是生活随笔為你收集整理的Swift,任重而道远!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。