Rodzaj wnioskowanie nie wpłynie na wydajność w swojej podanym przykładzie. Jednakże zauważyłem, że specyfika typowania w tablicy Swift znacząco wpływa na wydajność.
Na przykład poniższa metoda tasuje tablicę typu 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
}
}
Powyższą czynność jest znacznie mniejsza niż w przypadku, ja, aby ta funkcja ma tablicę Int
zamiast jak to
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
}
}
funkcji, która wykorzystuje [Any]
taktowany w co 0,537 s 3% odchylenia standardowego za 1 milion obiektów: Int
. I funkcja, która używa [Int]
taktowania w 0,181 sekundy 2% STDEV dla 1 miliona obiektów Int.
Możesz sprawdzić to powtórzenie (https://github.com/vsco/swift-benchmarks), które zawiera o wiele bardziej interesujące benchmarki w Swift. Jednym z moich ulubionych jest to, że generatory Swift działają bardzo słabo w wyżej wymienionych warunkach testowych.
Po sprawdzeniu kompilatora nie wpłynie to w żaden sposób na wydajność aplikacji. 'let a = 1' i' let a: Int = 1' są całkowicie równoważne. Jeśli sprawdzasz 'a' przy użyciu alt + kliknięcie, powie to, że jest to typ' Int'. – Jack
Czy kompilator nie sprawdzi żadnego typu dla 1, zanim ustawi go jako Int? – user2462805
Um? Być może nie całkiem rozumiesz punkt inferencji typu statycznego. Kiedy zostawisz adnotację, nie znaczy to, że kompilator traktuje zmienną tylko jakąś ogólną wartość rejestru, którą musi obejść. Najpierw następuje wnioskowanie typów, zmienna jest następnie traktowana tak, jakby była tym typem we wszystkich wyrażeniach, w których jest używana. Jeśli z jakiegoś powodu kompilator nie może wydedukować typu zmiennej, staje się błędem typu. Nic nie występuje w środowisku wykonawczym. Nie można uzyskać żadnego przyrostu wydajności. – CodaFi