Quali sono i diversi costi di runtime sostenuti dai seguenti tipi di cast?Qual è il costo di runtime dei lanci di Swift?
numerico cast di costante, ad es .:
let f = 0.1 as CGFloat
mi piacerebbe immaginare questo ha un costo di esecuzione pari a zero.
numerico cast del valore di runtime, ad es .:
let f = someDoubleValue as CGFloat
Mi piacerebbe immaginare questo ha un costo estremamente ridotto tempo di esecuzione.
upcast, ad es .:
let dict: [String: Int] = ... let anyObj = dict as AnyObject
mi aspetto questo per avere costi di esecuzione pari a zero.
Failable Downcast, ad es .:
let anyObj: AnyObject = ... if let str = anyObj as? String { ... }
mi aspetto questo per avere un costo di esecuzione proporzionale al numero di classi nella gerarchia di tipo dinamico di
anyObj
.forzata Downcast, ad es .:
let anyObj: AnyObject = ... let str = anyObj as! String
Forse il costo per un downcast forzata è leggermente inferiore?
forzato Downcast di raccolta, ad es .:
let dates: [AnyObject] = ... for date in dates as! [NSDate] { ... }
Cosa succede qui - soprattutto quando si proviene da un
dates
NSArray
? Il costo di esecuzione di questo cast è proporzionale al numero dei suoi elementi? Cosa succede se lancio su un tipo di raccolta più complesso come[String: [String: [Int]]]
- l'intera raccolta è attraversata per assicurarsi che tutti i suoi elementi e sottoelementi siano conformi a questo cast?
Per ciascuno dei primi quattro casi, le mie affermazioni sono vere?
Credo che ci sono troppe risposte possibili e corrette alle vostre numerose domande. Per esempio. il tuo no 2: un ottimizzatore può rilevare come 'f' è usato e se l'architettura della macchina si adatta può semplicemente usare' someDoubleValue' direttamente come 'Double' mentre in altri casi deve copiare il valore in qualche memoria extra. Nel caso in cui avrà bisogno di memoria in quanto potrebbe mantenere tutto nei registri. Se la prestazione in questi casi è in discussione: creare un punto di riferimento. –
Come ho capito, il n. 3 non è davvero un esempio upcast, perché il dizionario veloce è una struttura e quando lo si "lancia" su AnyObject, swift in realtà crea NSDictionary. Questo deve essere lo stesso per Int -> NSNumber, String -> NSString e altri –