最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分析Swift性能高效的原因

 更新時間:2020年10月27日 11:44:24   作者:louis_wang  
絕大多數公司選擇Swift語言開發(fā)iOS應用,主要原因是因為Swift相比Objc有更快的運行效率,更加安全的類型檢測,更多現代語言的特性提升開發(fā)效率;這一系列的優(yōu)點使Swift語言的熱度越來越高。

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

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

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

更加高效的數據類型

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

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

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

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

靜態(tài)派發(fā)相比于動態(tài)派發(fā)更快,而且靜態(tài)派發(fā)還會進行內聯(lián)等一些優(yōu)化,減少函數的尋址及內存地址的偏移計算等一系列操作,使函數的執(zhí)行速度更快,性能更高。

數據類型(struct/class)

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

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

我們在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中的屬性值,如下圖所示:

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

協(xié)議類型(protocol type)

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

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

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

編譯過程

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

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

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

Clang編譯流程

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語言開發(fā)團隊在開發(fā)過程中進行了一系列的優(yōu)化,其中最關鍵的是引入SIL.

swift編譯流程

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

高級別語言

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

安全語言

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

swift編譯流程:

Swift 源碼到IR之間的流程:

Swift 編譯過程引入SIL有幾個優(yōu)點:

  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上運行的,用于確定優(yōu)化和診斷合格,對不合格的代碼嵌入特定的語言診斷。這些操作一定會執(zhí)行,即使在-Onone選項下也不例外。之后產生 正式(canonical) SIL.
  • 一般情況下,是否在正式SIL上運行SIL優(yōu)化是可選的,這個檢測可以提升結果可執(zhí)行文件的性能.可以通過優(yōu)化級別來控制,在-Onone模式下不會執(zhí)行.
  • IRGen會將正式SIL降級為LLVM IR.
  • LLVM后端提供LLVM優(yōu)化,執(zhí)行LLVM代碼生成器并產生二進制碼.

在上面的流程中,SIL對Swift的編譯過程進行了一系列的優(yōu)化,即保證的代碼執(zhí)行的安全性,又提升了代碼執(zhí)行的效率.

結尾

上面從Swift語言設計的數據結構及編譯流程等方面進行了簡單的分析,中間有很多細節(jié)沒有在文章里闡述特別清晰,如果有興趣了解更多,可以參考以下資料。

以上就是分析Swift性能高效的原因的詳細內容,更多關于Swift性能的資料請關注腳本之家其它相關文章!

相關文章

  • Swift重構自定義空等運算符 “??=” 實例

    Swift重構自定義空等運算符 “??=” 實例

    這篇文章主要為大家介紹了Swift重構自定義空等運算符 “??=” 實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Swift中圖片資源使用流程的優(yōu)化方法詳解

    Swift中圖片資源使用流程的優(yōu)化方法詳解

    這篇文章主要給大家介紹了關于Swift中圖片資源使用流程的優(yōu)化方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01
  • swift 3.0 實現短信驗證碼倒計時功能

    swift 3.0 實現短信驗證碼倒計時功能

    這篇文章主要介紹了swift 3.0 實現短信驗證碼倒計時功能的相關資料,需要的朋友可以參考下
    2017-02-02
  • iPhone與iWatch連接、控制、數據傳遞(Swift)的方法

    iPhone與iWatch連接、控制、數據傳遞(Swift)的方法

    這篇文章主要介紹了iPhone與iWatch連接、控制、數據傳遞(Swift)的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • swift中利用runtime交換方法的實現示例

    swift中利用runtime交換方法的實現示例

    這篇文章主要給大家介紹了關于swift中利用runtime交換方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-05-05
  • swift where與匹配模式的實例詳解

    swift where與匹配模式的實例詳解

    這篇文章主要介紹了swift where與匹配模式的實例詳解的相關資料,這里附有簡單的示例代碼,講的比較清楚,需要的朋友可以參考下
    2017-07-07
  • SwiftUI 登錄界面布局實現示例詳解

    SwiftUI 登錄界面布局實現示例詳解

    這篇文章主要為大家介紹了SwiftUI 登錄界面布局實現示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Swift 3.0 enum 的靈活使用介紹

    Swift 3.0 enum 的靈活使用介紹

    這篇文章主要介紹了Swift 3.0 enum 的靈活使用介紹,非常具有實用價值,需要的朋友可以參考下
    2017-05-05
  • 深入淺出的聊聊Swift高階函數

    深入淺出的聊聊Swift高階函數

    函數式編程就是高階函數編程的應用,所以要熟練掌握基礎的高階函數是必須的filter、map、reduce、flatmap就是必備的高階函數,這篇文章主要給大家介紹了關于Swift高階函數的相關資料,需要的朋友可以參考下
    2021-09-09
  • 深入解析Swift編程中的構造方法

    深入解析Swift編程中的構造方法

    先進的Swfit語言同樣具有構造方法,構造方法在對象被創(chuàng)建后會首先被調用,這里我們就來深入解析Swift編程中的構造方法:
    2016-07-07

最新評論

新河县| 常德市| 怀柔区| 加查县| 扶沟县| 克拉玛依市| 新民市| 台州市| 蒙阴县| 桑植县| 营口市| 剑阁县| 丁青县| 桃源县| 神池县| 元谋县| 东安县| 宽甸| 沙湾县| 衡阳市| 监利县| 江都市| 会同县| 通渭县| 长治市| 孝昌县| 盘锦市| 兰溪市| 高平市| 靖江市| 东兰县| 松溪县| 麻江县| 永年县| 甘南县| 上蔡县| 新宾| 新巴尔虎右旗| 谢通门县| 厦门市| 泸溪县|