2014-07-05 14 views
6

Sto leggendo un tutorial su Swift (http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start) e preconizzato per non impostare il tipo esplicitamente perché è più leggibile in questo modo.Swift Explicit vs. Inferred Typing: Performance

Non sono d'accordo su questo punto, ma non è questa la domanda. La mia domanda è: è più efficiente, in termini di prestazioni (compilatore ...) impostare il tipo in modo esplicito?

Ad esempio, sarebbe questo: var hello: Int = 56 essere più efficiente di questo: var tutorialTeam = 56

+2

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

+0

Il compilatore non verificherà alcun tipo per 1 prima che lo imposti come Int? – user2462805

+3

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

risposta

13

Non c'è alcuna differenza di prestazioni tra codice che utilizza tipi espliciti e codice che utilizza l'inferenza dei tipi. L'output compilato è identico in ciascun caso.

Quando si omette il tipo, il compilatore lo sottrae semplicemente.

Le piccolissime differenze osservate nello accepted answer sono solo i tuoi soliti artefatti di benchmarking e non ci si può fidare!

Se includere o meno il tipo esplicito è una questione di gusti. In alcuni contesti potrebbe rendere il tuo codice più leggibile.

L'unica volta che fa la differenza per il codice è quando si desidera specificare un tipo diverso da quello che il compilatore dedurrebbe. Come esempio:

var num = 2 

Il codice sopra ne deduce che num è un Int, causa di una sua inizializzato con un numero intero letterale. Tuttavia si puo 'forza' di essere un Double come segue:

var num: Double = 2 
+0

Questa è la risposta corretta. La compilazione è la stessa, quindi è letteralmente impossibile per i tipi espliciti o impliciti fare qualsiasi differenza nelle prestazioni. –

+0

@PaulManta - grazie, mi ha infastidito vedere la risposta accettata che è palesemente sbagliata! – ColinE

+0

Buona idea controllare l'output compilato. –

0

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

2

Dalla mia esperienza, c'è stato un enorme impatto sulle prestazioni in termini di velocità di compilazione quando si utilizzano tipi espliciti o derivati. La maggior parte del mio lento codice di compilazione è stata risolta digitando esplicitamente le variabili.

Sembra che il compilatore Swift abbia ancora margini di miglioramento in quest'area. Prova a confrontare alcuni dei tuoi progetti e vedrai una grande differenza.

Ecco un articolo che ho scritto su how to speed up slow Swift compile times e come scoprire cosa lo sta causando.