Tag: 中央调度

使用dispatch_group_async的并发代码的性能比单线程版本慢得多

最近我一直在做大量的随机数生成“正态分布”钟形曲线的实验。 方法很简单: 创build一个整数数组并将其归零。 (我使用2001整数) 重复计算该数组中的索引,并将该数组中的条目编入索引,如下所示 循环999或1000次。 在每次迭代中: 以中心值(1000)为数组索引 生成一个随机数= + 1 / -1。 并将其添加到数组索引 在循环结束时,在计算的数组索引处增加值。 由于随机值0/1倾向于频繁出现,因此上面内部循环的结束索引值倾向于保持接近中心值。 比起始值大得多/小得多的指标值越来越不寻常。 在大量重复之后,数组中的值呈现正态分布钟形曲线的形状。 然而,我使用的高质量的随机函数arc4random_uniform()相当慢,并且需要很多迭代才能生成平滑的曲线。 我想计划10亿(十亿)点。 在主线程上运行,大约需要16个小时。 我决定重写计算代码来使用dispatch_async,并在我的8核心Mac Pro上运行它。 我结束了使用dispatch_group_async()提交8个块,dispatch_group_notify()在所有块完成处理时通知程序。 为了简化第一遍,所有8个块写入相同的NSUInteger数组。 在读取/修改写入数组条目时,出现竞争条件的可能性很小,但是在这种情况下,这只会导致一个值丢失。 我正打算在稍后添加一个锁到数组增量(或者甚至可以在每个块中创build单独的数组,然后将它们相加)。 无论如何,我重构代码使用dispatch_group_async()并计算每个块中的总值的1/8,并设置我的代码运行。 对我来说,并发代码尽pipe最大化了我Mac上的所有内核,但运行速度比单线程代码慢。 单线程运行时,每秒可以得到大约17,800个点。 当使用dispatch_group_async运行时,性能下降到更像665点/秒,或约1/26的速度 。 我已经改变了我提交的块数 – 2,4或8,没关系。 性能是可怕的。 我也尝试使用dispatch_async提交所有8个块,没有dispatch_group。 这也没有关系。 目前没有阻塞/locking正在进行:所有块全速运行。 对于为什么并发代码运行速度慢,我感到十分困惑。 现在的代码有点混乱,因为我重构了它的单线程或同时工作,所以我可以testing。 以下是运行计算的代码: randCount = 2; #define K_USE_ASYNC 1 #if K_USE_ASYNC dispatch_queue_t highQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); […]

GCD中的并发与串行队列

我正在努力完全理解GCD中的并发和串行队列。 我有一些问题,希望有人能够清楚地回答我的问题。 我正在读取串行队列被创build和使用,以便一个接一个地执行任务。 但是,如果发生以下情况: 我创build一个串行队列 我使用dispatch_async (在我刚创build的串行队列上)三次分派三个块A,B,C 这三个块是否会被执行: 按顺序A,B,C,因为队列是串行的 要么 同时(在parralel线程同时),因为我使用ASYNC调度 我读到我可以在并发队列上使用dispatch_sync来一个接一个地执行块。 在这种情况下,为什么串行队列甚至存在,因为我总是可以使用一个并发队列,在那里我可以同步调度尽可能多的块? 感谢您的任何好解释!