您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關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中的屬性值,如下圖所示:
結構體除了屬性的存儲更安全、效率更高之外,其函數的派發也更高效。由于結構體不能被繼承,也就是結構體的類型被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編譯過程而設計的中間語言,主要包含了以下功能:
Clang編譯流程
Clang編譯過程有以下幾個缺點:
由于以上這些缺點,swift語言開發團隊在開發過程中進行了一系列的優化,其中最關鍵的是引入SIL.
swift編譯流程
Swift作為一個高級別和安全的語言具有以下特點:
高級別語言
安全語言
swift編譯流程:
Swift 源碼到IR之間的流程:
Swift 編譯過程引入SIL有幾個優點:
Swift編譯器的流程
Swift編譯器作為高級編譯器,具有以下嚴格的傳遞流程結構。
Swift編譯器的流程如下:
關于Swift性能高效的原因有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
關于Swift性能高效的原因有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。