2010-09-22 10 views
24

Nello sviluppo di iPhone, la velocità è essenziale. Qualcuno sa se c'è una differenza di velocità tra l'utilizzo di un tipo CoreFoundation (come CFMutableDictionaryRef) rispetto a un tipo di Foundation (la sua controparte, NSMutableDictionary).CoreFoundation vs Foundation

Penso che la manipolazione del tipo di CF sarebbe più veloce in quanto non deve gettare messaggi di runtime ObjC, è un'ipotesi infondata, qualcuno ha effettivamente guardato a questo?

-James

+3

Quando dici che la velocità è essenziale, intendi velocità di sviluppo o velocità dell'applicazione sviluppata? – JeremyP

+0

Velocità nell'applicazione stessa. – grmartin

risposta

34

in senso tecnico, sì, è più veloce, proprio per questo motivo.

In senso pratico no, non è più veloce. Per prima cosa, la differenza di velocità è minuscola. Stiamo parlando di millisecondi salvati durante la vita dell'intero processo.

I risparmi potrebbero essere maggiori su iPhone, ma è ancora il guadagno di velocità più piccolo che si possa ottenere. Il tuo tempo è molto più speso profilando la tua app in Strumenti e andando dove ti dice e stirando i punti caldi nel tuo codice.

Ed è qui che la Fondazione diventa più veloce: Il tuo tempo.

codice che utilizza la funzione di rilascio automatico della Fondazione se praticabile puoi risparmiare un sacco di tempo e mal di testa, evitando perdite di memoria facilmente evitabili (vale a dire, dimenticando di scrivere o non riuscendo a raggiungere release messaggi). CF non ha autorelease, quindi devi ricordare esplicitamente di CFRelease tutto ciò che crei o copi con esso - e quando dimentichi o non riesci a raggiungere quel codice (e intendo lo al momento - parlo per esperienza), spenderai molto più tempo a cercare la perdita di memoria. L'analizzatore statico aiuta, ma non sarà mai in grado di catturare tutto.

(È tecnicamente possibile oggetti autorelease CF, ma il codice per farlo è terribilmente brutto e si sta solo annacquare il tuo guadagno di velocità già minuscola.)

Quindi, attenersi a quanto Foundation possibile. Non esagerare con l'autorelease; anche nel puro Cocoa, ci sono ancora momenti in cui è giustificato il rilascio esplicito di oggetti (per lo più loop stretti), e questo è doppio per Cocoa Touch (dato che iOS ucciderà la tua app se assegni troppa memoria, quindi vorrai rilasciare grandi oggetti come le immagini il prima possibile). Ma di solito, autorelease ti risparmia molto più tempo di quanto CF possa mai salvare i tuoi utenti.

Il motivo non correlato al tempo è che il codice Objective-C, con nomi di argomenti (dal selettore messaggi) integrati con valori, è molto più facile da leggere rispetto al codice basato su funzione C. Questo potrebbe non rendere il tuo lavoro più veloce, ma sicuramente lo rende più divertente.

+0

Quando uso gli oggetti CF, utilizzo sempre un wrapper C++ il cui distruttore si prende cura di CFRelease e che ha anche costruttori di copia e tali che fanno la cosa giusta. Ricordare di mettere un oggetto CF in tale wrapper non appena è stato creato non è più difficile che ricordare di autorelease oggetti Foundation, almeno per me. Ma sono d'accordo sul fatto che qualsiasi differenza di tempo è probabilmente minima, e che si dovrebbe lasciare che un profiler guidi i propri sforzi di ottimizzazione. – JWWalker

+0

Sto cercando di convertire una tonnellata di dati da un formato di testo strutturato personalizzato in oggetti veri da usare per l'iPhone. Tuttavia, segnerò questo come risposta. – grmartin

+0

@JWWalker: se hai intenzione di avvolgere un oggetto CoreFoundation, perché non includerlo in Objective-C? In effetti, le classi con analoghi CF sono spesso solo involucri attorno alla classe CF. (Ad esempio, 'NSMutableDictionary' è un cluster di classi che restituisce spesso un oggetto la cui classe effettiva è' NSCFDictionary', che è fondamentalmente solo una classe ObjC che utilizza un CFDictionary come suo backing store.) – mipadi

3

Scrivere codice nelle funzioni CF porterà effettivamente un aumento delle prestazioni alla tua app, tuttavia c'è un altro approccio migliore per migliorare le prestazioni: scrivere direttamente in assembly porterebbe ancora più vantaggi in termini di prestazioni (anche se questo è un approccio estremo).

I costrutti di linguaggio di alto livello sono preferibili a quelli di basso livello per almeno i motivi menzionati da Peter Hosey. A questo possiamo aggiungere l'ottimizzazione prematura che può facilmente portare al fallimento del progetto, in quanto lo sviluppatore è più interessato agli aspetti non funzionali dell'applicazione anziché a quelli funzionali.

Se dopo aver installato un'app completamente funzionale, si ritiene che alcune parti del codice abbiano colli di bottiglia nelle prestazioni, è possibile provare a ottimizzarle, riscrivendole in costrutti linguistici di basso livello. Avrai almeno un punto di confronto con il codice corrente, per assicurarti che il codice di basso livello si comporti come previsto (i test manuali o unitari faranno il trucco qui).

Problemi correlati