Process Array in parallel using GCD

前端 未结 5 1318
青春惊慌失措
青春惊慌失措 2020-12-09 11:22

I have a large array that I would like to process by handing slices of it to a few asynchronous tasks. As a proof of concept, I have the written the following code:

5条回答
  •  独厮守ぢ
    2020-12-09 11:54

    Any solution that assigns the i'th element of the array concurrently risks race condition (Swift's array is not thread-safe). On the other hand, dispatching to the same queue (in this case main) before updating solves the problem but results in a slower performance overall. The only reason I see for taking either of these two approaches is if the array (summary) cannot wait for all concurrent operations to finish.

    Otherwise, perform the concurrent operations on a local copy and assign it to summary upon completion. No race condition, no performance hit:

    Swift 4

    func calcSummary(of array: [Int]) -> [Int] {
        var summary = Array.init(repeating: 0, count: array.count)
    
        let iterations = 10 // number of parallel operations  
    
        DispatchQueue.concurrentPerform(iterations: iterations) { index in
            let start = index * array.count / iterations
            let end = (index + 1) * array.count / iterations
    
            for i in start..

    I've answered a similar question here for simply initializing an array after computing on another array

提交回复
热议问题