V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shengyang998
V2EX  ›  问与答

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

  •  
  •   shengyang998 · 2019-01-11 20:13:49 +08:00 · 1221 次点击
    这是一个创建于 2137 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    
    1 条回复
    66450146
        1
    66450146  
       2019-01-11 22:19:44 +08:00
    因为 overhead 比计算花的时间更长啊……而且这也不是 STL ……

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


    一个程序员碰到了一个问题,他决定用多线程来解决。现在他有两个了问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6144 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:20 · PVG 14:20 · LAX 22:20 · JFK 01:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.