Lo scopo del sincronodispatch_apply
è a in modo asincrono invia le interazioni del loop interno alle risorse di elaborazione parallele disponibili. Pertanto, le prestazioni globali del circuito potrebbero accelerare.
Prestazioni del ciclo più veloce? Molto probabilmente, sì. (vedi avvertenza)
Blocca il thread che chiama dispatch_apply
? Sì, proprio come i blocchi di loop fino al completamento.
Per GCD, dispatch_apply
è sincrono poiché dispatch_apply
non tornerà fino tutto ilasincrono, parallele compiti che crea dispatch_apply
hanno completato.
Tuttavia, ogni singola attività accodato da dispatch_apply
può funzionare come concomitante asincrono compiti se il bersaglio queue
è asincrono.
Per esempio in Swift:
let batchCount: Int = 10
let queue = dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)
dispatch_apply(batchCount, queue) {
(i: Int) -> Void in
print(i, terminator: " ")
}
print("\ndispatch_apply QOS_CLASS_UTILITY queue completed")
cede uscita ordinata come:
0 8 1 9 2 3 4 5 6 7
dispatch_apply QOS_CLASS_UTILITY queue completed
Quindi, dispatch_apply
sincrono blocchi quando viene chiamato, ma la "partita" delle attività generato da dispatch_apply
possono essere eseguiti contemporaneamente, in modo asincrono, in parallelo tra loro.
Tenere presente l'avvertenza che ...
il lavoro svolto durante ogni iterazione è distinta dal lavoro eseguiti durante tutte le altre iterazioni, e l'ordine in cui ciascun successivo ciclo finito è irrilevante
Inoltre, nota che l'utilizzo di una coda seriale per le attività del ciclo interno non avrà alcun guadagno in termini di prestazioni.
Sebbene l'utilizzo di una coda di serie è ammissibile e fa la cosa giusta per il codice, utilizzando tale coda è alcun vantaggio reale di prestazioni sopra lasciando l'anello al suo posto.
Impressionante, questo è esattamente quello che voglio fare. Grazie. – Jessica