我在讀一本關於SWIFT教程(http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start),它preconized,因爲它更具有可讀性這種方式不設置類型明確。斯威夫特明確與推斷打字:性能
我並不完全同意這一點,但這不是問題。我的問題是:在性能(編譯器...)中顯式設置類型是否更高效?
例如,將這樣的:var hello: Int = 56
比這更有效:var tutorialTeam = 56
我在讀一本關於SWIFT教程(http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start),它preconized,因爲它更具有可讀性這種方式不設置類型明確。斯威夫特明確與推斷打字:性能
我並不完全同意這一點,但這不是問題。我的問題是:在性能(編譯器...)中顯式設置類型是否更高效?
例如,將這樣的:var hello: Int = 56
比這更有效:var tutorialTeam = 56
有碼之間的性能沒有差異使用明確的類型和代碼,它使用類型推理。編譯後的輸出在每種情況下都是相同的。
當您省略該類型時,編譯器會簡單地推斷它。
在accepted answer觀察到的非常小的差別只是你平常的微基準文物,並不能信任!
無論你是否包含顯式類型都是一個口味問題。在某些情況下,它可能會使您的代碼更具可讀性。
它使你的代碼的差別的唯一情況是,當你想指定不同類型的其中一個編譯器會推斷。作爲一個例子:
var num = 2
上述代碼推斷num
是Int
,由於它是與文字的整數初始化。然而,你可以「迫使」這是一個Double
如下:
var num: Double = 2
這是正確的答案。編譯出來的結果是一樣的,所以顯式或隱式類型在性能上有所差異是不可能的。 –
@PaulManta - 謝謝你,讓我看到接受的答案是公然錯誤的! – ColinE
好主意檢查編譯後的輸出。 –
類型推斷不會影響你給出的例子性能。但是,我確實發現在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),詳細介紹了很多更有趣的基準斯威夫特。我最喜歡的人的是,雨燕的仿製藥與上述
提到的從我的經驗的測試條件下的性能很差,有使用顯式VS推斷類型時,一直在編譯速度方面巨大的性能影響。我的大部分慢編譯代碼已通過顯式鍵入變量來解決。
看來Swift編譯器在這方面還有改進的空間。嘗試對你的一些項目進行基準測試,你會看到很大的差異。
這是我寫在how to speed up slow Swift compile times上的文章,以及如何找出造成它的原因。
由於它的編譯器檢查,它不會影響你的應用程序的性能。 「讓a = 1」和「讓a:Int = 1」完全等價。如果你使用alt + click來檢查'a',它會說它是'Int'類型。 – Jack
在將其設置爲Int之前,編譯器是否不檢查任何類型? – user2462805
嗯?也許你不太理解靜態類型推斷的要點。當你留下一個註釋時,並不意味着編譯器只是將這個變量當作一些通用寄存器值來處理。類型推斷首先發生,然後將該變量視爲它在其中使用的所有表達式中的類型。如果由於某種原因,編譯器無法推斷出該變量的類型,則會變成類型錯誤。運行時不會發生任何事沒有性能收益。 – CodaFi