concurrentMap 实现如下:
extension Array {
func concurrentMap<T>(_ mapper: (Element) -> T) -> [T] {
if self.count == 0 {
return []
}
let q = DispatchQueue(label: "dispatch sync queue")
var result = Array<T?>(repeating: nil, count: self.count)
DispatchQueue.concurrentPerform(iterations: self.count) { (idx) in
let element = self[idx]
let transformed = mapper(element)
q.sync {
result[idx] = transformed
}
}
return result.map{ $0! }
}
}
测试用例如下:
let a = Array(0..<60000)
let startTime = mach_absolute_time()
a.map{ $0 / 2000 }
let midTime = mach_absolute_time()
a.concurrentMap{ $0 / 2000 }
let endTime = mach_absolute_time()
结果:
There are 60000 elements.
STL map consumes: 8144985
concurrentMap consumes: 567991454
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.