2014-07-05 46 views
6

我在讀一本關於SWIFT教程(http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start),它preconized,因爲它更具有可讀性這種方式不設置類型明確。斯威夫特明確與推斷打字:性能

我並不完全同意這一點,但這不是問題。我的問題是:在性能(編譯器...)中顯式設置類型是否更高效?

例如,將這樣的:var hello: Int = 56比這更有效:var tutorialTeam = 56

+2

由於它的編譯器檢查,它不會影響你的應用程序的性能。 「讓a = 1」和「讓a:Int = 1」完全等價。如果你使用alt + click來檢查'a',它會說它是'Int'類型。 – Jack

+0

在將其設置爲Int之前,編譯器是否不檢查任何類型? – user2462805

+3

嗯?也許你不太理解靜態類型推斷的要點。當你留下一個註釋時,並不意味着編譯器只是將這個變量當作一些通用寄存器值來處理。類型推斷首先發生,然後將該變量視爲它在其中使用的所有表達式中的類型。如果由於某種原因,編譯器無法推斷出該變量的類型,則會變成類型錯誤。運行時不會發生任何事沒有性能收益。 – CodaFi

回答

13

碼之間的性能沒有差異使用明確的類型和代碼,它使用類型推理。編譯後的輸出在每種情況下都是相同的。

當您省略該類型時,編譯器會簡單地推斷它。

accepted answer觀察到的非常小的差別只是你平常的微基準文物,並不能信任!

無論你是否包含顯式類型都是一個口味問題。在某些情況下,它可能會使您的代碼更具可讀性。

它使你的代碼的差別的唯一情況是,當你想指定不同類型的其中一個編譯器會推斷。作爲一個例子:

var num = 2 

上述代碼推斷numInt,由於它是與文字的整數初始化。然而,你可以「迫使」這是一個Double如下:

var num: Double = 2 
+0

這是正確的答案。編譯出來的結果是一樣的,所以顯式或隱式類型在性能上有所差異是不可能的。 –

+0

@PaulManta - 謝謝你,讓我看到接受的答案是公然錯誤的! – ColinE

+0

好主意檢查編譯後的輸出。 –

0

類型推斷不會影響你給出的例子性能。但是,我確實發現在Swift數組中使用Type對於性能有顯着影響。

例如,下面的方法洗牌Any類型的陣列。

class func shuffleAny(inout array: [Any]) { 
    for (var i = 0; i < array.count; i++) { 
     let currentObject: Any = array[i] 
     let randomIndex = Int(arc4random()) % array.count 
     let randomObject: Any = array[randomIndex] 

     array[i] = randomObject; 
     array[randomIndex] = currentObject 
    } 
} 

上述功能實際上比如果我是使這個功能拍攝的Int陣列代替這樣

class func shuffleIntObjects(inout array: [Int]) { 
    for (var i = 0; i < array.count; i++) { 
     let currentObject: Int = array[i] 
     let randomIndex = Int(arc4random()) % array.count 
     let randomObject: Int = array[randomIndex] 

     array[i] = randomObject; 
     array[randomIndex] = currentObject 
    } 
} 

使用[Any]在0.537秒3%STDEV主頻中的功能慢得多爲100萬Int個對象。對於1百萬個Int對象,使用[Int]的函數以0.181秒2%的STDEV進行計時。

你可以看看這個回購協議(https://github.com/vsco/swift-benchmarks),詳細介紹了很多更有趣的基準斯威夫特。我最喜歡的人的是,雨燕的仿製藥與上述

2

提到的從我的經驗的測試條件下的性能很差,有使用顯式VS推斷類型時,一直在編譯速度方面巨大的性能影響。我的大部分慢編譯代碼已通過顯式鍵入變量來解決。

看來Swift編譯器在這方面還有改進的空間。嘗試對你的一些項目進行基準測試,你會看到很大的差異。

這是我寫在how to speed up slow Swift compile times上的文章,以及如何找出造成它的原因。