shengyang998
V2EX  ›  问与答

为什么 Swift 里面自己实现的 concurrentMap() 会比 STL 自带的 map() 要慢? 据称自带的 map() 还是单线程的

  •  
  •   shengyang998 · Jan 11, 2019 · 2029 views
    This topic created in 2697 days ago, the information mentioned may be changed or developed.

    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
    
    66450146
        1
    66450146  
       Jan 11, 2019
    因为 overhead 比计算花的时间更长啊……而且这也不是 STL ……

    把 map 里面换成 `_ in sleep(1)` 就是 concurrent 更快了


    一个程序员碰到了一个问题,他决定用多线程来解决。现在他有两个了问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   6036 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 96821589 · 68ms · UTC 02:34 · PVG 10:34 · LAX 19:34 · JFK 22:34
    ♥ Do have faith in what you're doing.