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
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.
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.
- 1. Qual è la differenza tra il callback e la promessa
- 2. Qual è la differenza di prestazioni tra HttpModule e Global.aspx?
- 3. Qual è la differenza tra hook e callback?
- 4. Qual è la differenza tra chiamate asincrone e callback
- 5. RxJava: qual è la differenza tra i callback in doOnError ('callback') e subscribe (*, 'callback')
- 6. Differenza tra gestori di eventi e callback
- 7. Qual è la differenza tra $ e $$?
- 8. Qual è la differenza tra {0} e +?
- 9. Qual è la differenza tra = e: =
- 10. Qual è la differenza tra ("") e (null)
- 11. Qual è la differenza tra dict() e {}?
- 12. Qual è la differenza tra Verilog! e ~?
- 13. Qual è la differenza tra? : e ||
- 14. qual è la differenza tra [[], []] e [[]] * 2
- 15. Qual è la differenza tra " " e ""?
- 16. Qual è la differenza tra {0} e ""?
- 17. Qual è la differenza tra `##` e `hashCode`?
- 18. Qual è la differenza tra .ToString() e + ""
- 19. qual è la differenza tra:.! e: r !?
- 20. Tecnicamente qual è la differenza tra s3n, s3a e s3?
- 21. Qual è la differenza tra "app.render" e "res.render" in express.js?
- 22. Qual è la differenza tra "extends" e "include" in Jade?
- 23. Qual è la differenza tra: before_save e: before_update Callback di Active Record?
- 24. Qual è la differenza tra gli eventi "mouseup" e "clic"?
- 25. Qual è la differenza tra cogliere e raccogliere in Rails?
- 26. Qual è la differenza tra json e XML?
- 27. Qual è la differenza tra handle e thread?
- 28. Qual è la differenza tra a.getClass() e A.class in Java?
- 29. Qual è la differenza tra C++ gestito e C#?
- 30. Qual è la differenza tra UIImage (named :) e UIImage (imageLiteralResourceName :)?
Buona chiamata sui post di Mike Ash. – Don
una cosa da menzionare è il meccanismo di cattura con blocchi che si confrontano con i callback. –