2010-04-21 34 views
11

Una delle cose per cui gli oggetti bloccati, introdotti in Snow Leopard, vanno bene sono le situazioni che prima sarebbero state gestite con i callback. La sintassi è molto più pulita per il passaggio del contesto. Tuttavia, non ho visto alcuna informazione sulle implicazioni di prestazioni dell'utilizzo di blocchi in questo modo. Quali sono le eventuali insidie ​​sulle prestazioni dovrei cercare quando utilizzo i blocchi, in particolare in sostituzione di un callback in stile C?Qual è la differenza di prestazioni tra blocchi e callback?

risposta

11

Il tempo di esecuzione dei blocchi è piuttosto ridotto. I descrittori di blocchi e le funzioni sono allocati staticamente, in modo da poter ingrandire il working set del programma, ma solo "pagare" in memoria per le variabili di riferimento dall'ambito di chiusura. I valori letterali dei blocchi non globali e le variabili __block sono costruite nello stack senza alcuna ramificazione, quindi è improbabile che si verifichi un rallentamento eccessivo. Chiamare un blocco è solo result = (*b->__FuncPtr)(b, arg1, arg2); questo è paragonabile a result = (*callback_func_ptr)(callback_ctx, arg1, arg2).

Se si pensa ai blocchi come "callback che scrivono la propria struttura di contesto e gestiscono il brutto imballaggio, gestione della memoria, casting e dereferenziazione per te", penso che ti renderai conto che i blocchi sono un piccolo costo in fase di esecuzione e un enorme risparmio in termini di tempo di programmazione.

6

Si potrebbe voler verificare this blog post e this one. I blocchi sono implementati come oggetti Objective-C, eccetto che possono essere messi nello stack, quindi non devono necessariamente essere malloc 'd (se si mantiene un riferimento a un blocco, verrà comunque copiato sull'heap, comunque) . Probabilmente avranno prestazioni migliori rispetto alla maggior parte degli oggetti Objective-C, ma avranno un leggero impatto in termini di prestazioni rispetto a un semplice callback - immagino che non dovrebbe essere un problema il 95% delle volte.

+0

Buona chiamata sui post di Mike Ash. – Don

+0

una cosa da menzionare è il meccanismo di cattura con blocchi che si confrontano con i callback. –

Problemi correlati