亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Swift性能高效的原因有哪些

發布時間:2020-10-28 15:22:41 來源:億速云 閱讀:153 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關Swift性能高效的原因有哪些,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

自從2014年Apple發布Swift語言以來,歷時六年多,Swift已經發布到5.3版本,在5.0版本已經ABI stability,5.2版本也已經module stability,不管是語言還是基礎庫都日趨穩定,目前國內外大廠也都積極擁抱Swift陣營。

絕大多數公司選擇Swift語言開發iOS應用,主要原因是因為Swift相比Objc有更快的運行效率,更加安全的類型檢測,更多現代語言的特性提升開發效率;這一系列的優點使Swift語言的熱度越來越高。

大多數人知道Swift語言相比于Objc語言運行效率更高,但是卻不知道為什么效率更高,在這里我們Swift編譯層探討一下Swift語言高效的原因。

更加高效的數據類型

在開始討論Swift數據類型之前,我們先討論一下Swift的函數派發機制;

靜態派發、動態派發、消息派發(static dispatch、dynamic dispatch、message dispatch)
動態派發(dynamic dispatch): 動態派發是指編譯期無法確定應該調用哪個方法,需要在運行時才能確定方法的調用。

靜態派發(static dispatch):是在編譯期就能確定的調用方法的派發方式。

除了上面兩種方式之外,在Swift里面還會使用Objc的消息派發(message dispatch))機制;Objc采用了運行時采用obj_msgsend進行消息派發,所以Objc的一些動態特性在Swift里面也可以被限制的使用。

靜態派發相比于動態派發更快,而且靜態派發還會進行內聯等一些優化,減少函數的尋址及內存地址的偏移計算等一系列操作,使函數的執行速度更快,性能更高。

數據類型(struct/class)

我們都知道,內存分配可以分為堆區(Heap)和棧區(Stack)。由于棧區內存是連續的,內存的分配和銷毀是通過入棧和出棧操作進行的,速度要高于堆區。堆區存儲高級數據類型,在數據初始化時,查找沒有使用的內存,銷毀時再從內存中清除,所以堆區的數據存儲不一定是連續的。

類(class)和結構體(struct)在內存分配上是不同的,基本數據類型和結構體默認分配在棧區,而像類這種高級數據類型存儲在堆區,且堆區數據存儲不是線程安全的,在頻繁的數據讀寫操作時,要進行加鎖操作。

我們在swift文檔里面能看到對結構的描述,結構體是值類型(Value Type),當值類型的數據賦值給一個變量或常量,或者傳遞給一個函數時,是值拷貝;

例如:

struct Resolution {
  var width = 0
  var height = 0
}

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048

print("cinema is now \(cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"

print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"

通過這個例子我們能清楚的看到,當hd賦值給cinema時,是將hd中存儲的值拷貝給cinema,所以當給cinema的width屬性賦值的時候,并不會改變hd中的屬性值,如下圖所示:

Swift性能高效的原因有哪些

結構體除了屬性的存儲更安全、效率更高之外,其函數的派發也更高效。由于結構體不能被繼承,也就是結構體的類型被final修飾,根據我們對于動態派發及靜態派發的描述,那么其內部函數應該是屬于靜態派發,在編譯期就確定了函數的執行方式,其函數的調用通過內聯(inline)的方式進行優化,其內存連續,減少了函數的尋址及內存地址的偏移計算,其運行相比于動態派發更加高效。

協議類型(protocol type)

多態是面向對象的一大特性,在結構體中不能通過繼承或者引用語言的多態,swift就引入了協議(protocol),通過協議來實現了結構體的多態特性,這也是swift面向協議編程的核心所在。

對于類(class)來說,每個類都會創建一個虛擬函數表指針,這個指針則指向一個v-table表,也就是虛函數表,表內存儲著該類的函數指針數組,擁有繼承關系的子類會在虛函數表內通過繼承順序(C++可以實現多繼承)去展示虛函數表指針。類里面方法的派發則是根據v-table表里面函數指針來進行派發。

而結構體(struct)沒有繼承,也就是說結構體并沒有v-table表用于函數的派發。為了實現這一特性,在結構體的協議(protocol)的實現里添加了Protocol Witness Table用于管理協議類型的方法派發。

編譯過程

上面介紹了一些swift在數據結構上的一些優化,除了數據結構優化之外,swift在編譯過程也進行了大量的優化,其中最核心的優化,是在編譯過程中引入SIL。

SIL,Swift Intermediate Language,是為了優化swift編譯過程而設計的中間語言,主要包含了以下功能:

  1. 一系列的高級別優化保障,用于對運行時和診斷行為提供可預測的基線;
  2. 對swift語言數據流分析強制要求,對不滿足強制要求的問題產生診斷。例如變量和結構體必須明確初始化,代碼可達性即方法return的檢測,switch的覆蓋率;
  3. 確保高級別優化。包含retain/release優化,動態方法的去虛擬化,閉包內聯,內存初始化提升和泛型方法實例 化.
  4. 可用于分配"脆弱"內聯的穩定分配格式,將Swift庫組件的泛型優化為二進制。
     

Clang編譯流程

Swift性能高效的原因有哪些

Clang編譯過程有以下幾個缺點:

  1. 與代碼與LLVM IR之間有巨大的抽象鴻溝(Wide abstraction gap between source and LLVM IR );
  2. IR不適合源碼級別的分析(IR isn't suitable for source-level analysis );
  3. CFG(Control Flow Graph)缺少精準度(CFG lacks fidelity );
  4. CFG偏離主道(CFG is off the hot path );
  5. 在CFG和IR降級中會出現重復分析(Duplicated effort in CFG and IR lowering)。
     

由于以上這些缺點,swift語言開發團隊在開發過程中進行了一系列的優化,其中最關鍵的是引入SIL.

swift編譯流程

Swift作為一個高級別和安全的語言具有以下特點:

高級別語言

  • 通過代碼充分的展示語言的特性(Move more of the language into code)
  • 支持基于協議的泛型(Protocol-based generics)
     

安全語言

  • 充分的數據流檢查:未初始化變量,函數返回處理檢測,這些項在檢測不合格時會產生對應的編譯錯誤(Uninitialized vars, unreachable code should be compiler errors)
  • 邊界和溢出的檢測(Bounds and overflflow checks)
     

swift編譯流程:

Swift性能高效的原因有哪些

Swift 源碼到IR之間的流程:

Swift性能高效的原因有哪些

Swift 編譯過程引入SIL有幾個優點:

  1. 完成的變數程序的語義(Fully represents program semantics );
  2. 既能進行代碼的生成,又能進行代碼分析(Designed for both code generation and analysis );
  3. 處在編譯管線的主通道(Sits on the hot path of the compiler pipeline );
  4. 架起橋梁連接源碼與LLVM,減少源碼與LLVM之間的抽象鴻溝(Bridges the abstraction gap between source and LLVM)
     

Swift編譯器的流程

Swift編譯器作為高級編譯器,具有以下嚴格的傳遞流程結構。

Swift編譯器的流程如下:

  • Parse: 語法分析組件從Swift源碼構成AST
  • 語義分析組件對AST進行類型檢查,并對其進行類型信息注釋。
  • SILGen組件從AST形成"原始(raw)"SIL
  • 一系列在 生 SIL上運行的,用于確定優化和診斷合格,對不合格的代碼嵌入特定的語言診斷。這些操作一定會執行,即使在-Onone選項下也不例外。之后產生 正式(canonical) SIL.
  • 一般情況下,是否在正式SIL上運行SIL優化是可選的,這個檢測可以提升結果可執行文件的性能.可以通過優化級別來控制,在-Onone模式下不會執行.
  • IRGen會將正式SIL降級為LLVM IR.
  • LLVM后端提供LLVM優化,執行LLVM代碼生成器并產生二進制碼.在上面的流程中,SIL對Swift的編譯過程進行了一系列的優化,即保證的代碼執行的安全性,又提升了代碼執行的效率.

關于Swift性能高效的原因有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

關于Swift性能高效的原因有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

土默特右旗| 区。| 剑川县| 乌海市| 青河县| 卢龙县| 唐海县| 芷江| 舞钢市| 阳泉市| 韶关市| 安新县| 裕民县| 江城| 新干县| 亚东县| 巨野县| 永善县| 五常市| 广昌县| 阳东县| 云浮市| 合江县| 古丈县| 谷城县| 万安县| 虹口区| 临江市| 启东市| 昌平区| 库车县| 十堰市| 宁夏| 沂水县| 清苑县| 绥德县| 威海市| 临夏市| 乐陵市| 民丰县| 杭锦旗|