inferenza di tipo non influisce sulle prestazioni in data esempio. Tuttavia, ho trovato che essere specifico riguardo il Type nel tuo array Swift influisce significativamente sulle prestazioni.
Ad esempio, il metodo seguente mescola un array di tipo 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
}
}
La funzione di cui sopra è in realtà molto più lento rispetto se dovessi Tale funzione prende un array di Int
invece simili
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
}
}
La funzione che utilizza [Any]
clock in alle 0.537 secondi 3% DEV.ST. per 1 milione di oggetti Int
. E la funzione che utilizza [Int]
ha registrato un ritardo di 0,181 secondi 2% STDEV per 1 milione di oggetti Int.
È possibile controllare questo repo (https://github.com/vsco/swift-benchmarks) che fornisce dettagli molto più interessanti di benchmark in Swift. Uno dei miei preferiti è che i generici di Swift funzionano molto male con le condizioni di test menzionate sopra
Dal momento che è un controllo del compilatore, non avrà alcun effetto sulle prestazioni della tua app. 'let a = 1' e' let a: Int = 1' sono completamente equivalenti. Se controlli 'a' usando alt + click, dirà che è un tipo' Int'. – Jack
Il compilatore non verificherà alcun tipo per 1 prima che lo imposti come Int? – user2462805
Um? Forse non stai capendo il punto di inferenza di tipo statico. Quando si esce da un'annotazione, ciò non significa che il compilatore tratti semplicemente la variabile come un valore di registro generico su cui deve funzionare. L'inferenza di tipo si verifica prima, la variabile viene quindi considerata come se fosse di quel tipo in tutte le espressioni in cui è usata. Se per qualche motivo il compilatore non può dedurre il tipo della variabile, diventa un errore di tipo. Non succede nulla in fase di runtime. Non vi è alcun guadagno in termini di prestazioni. – CodaFi