如何使用GCD或类似方法确定适当的任务数量?

时间:2011-12-18 00:48:18

标签: macos concurrency grand-central-dispatch task

我经常遇到一些情况,即我需要独立执行大量小型操作。在这些情况下,与每个操作所花费的实际时间相比,操作的数量是如此之大,因此,即使GCD开销通常较低,由于开销,仅为每个操作创建任务也是不合适的。

所以你想要做的就是将操作数分成很好的块,每个任务在一个块上运行。但是如何确定适当的任务/块数?

1 个答案:

答案 0 :(得分:0)

测试和分析。什么是有道理的,什么是有效的是特定于应用程序。

基本上你需要决定两件事:

  1. 要生成的工作进程/线程数
  2. 他们将使用的块的大小
  3. 使用这两个数字进行游戏,并计算其吞吐量(每秒完成的任务数*工人数)。在某个地方,你会发现速度,工人数量和大块任务数量之间的良好平衡。

    通过为工作人员提供大量测试数据(实质上是基准测试数据)并在调整这两个变量时自动测量其吞吐量,您可以更简单地找到合适的平衡点。记录每个工人大小/任务块大小组合的吞吐量,并在最后输出。 最高吞吐量是您的最佳组合。

    最后,如果特定任务需要多长时间取决于任务本身(例如,某些任务需要X时间,而有些任务需要花费X*3时间,那么您可以采取几种方法根据您工作的性质,您可以尝试以下方法之一:

    • 提供您的基准历史数据 - 要处理的一堆真实数据,表示将进入工作网格的实际工作类型,并使用该示例数据测量吞吐量。
    • 生成随机大小的任务,这些任务跨越您认为您将看到的内容,并选择在多种规模的任务中平均效果最佳的组合
    • 如果您可以阅读任务中的数据,并且数据会让您知道该任务是否需要X时间,或X*3(或介于两者之间),您可以在处理任务本身之前使用该信息来动态调整工作者/任务大小,以根据当前工作负载实现最佳吞吐量。这种方法适用于Amazon EC2,客户将在需要时启动额外的VM以处理更高的负载,并在负载下降时将其旋转回来。例如。

    无论您选择什么,任何未知的速度问题几乎总是涉及某种演示基准测试,如果它运行的速度对您的应用程序的成功至关重要(有时处理的时间太短,可以忽略不计)

    祝你好运!