确定 C# Partitioner.GetPartitions() 的 partitionCount 的因素

Jim*_*uck 6 c# asynchronous task-parallel-library async-await

下面是Stephen Toub 编写的一个实现ForEachAsync

public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body) 
{ 
    return Task.WhenAll( 
        from partition in Partitioner.Create(source).GetPartitions(dop) 
        select Task.Run(async delegate { 
            using (partition) 
                while (partition.MoveNext()) 
                    await body(partition.Current); 
        })); 
}
Run Code Online (Sandbox Code Playgroud)

指定 partitionCount 时应考虑哪些因素(dop在本例中)?

硬件是否有所作为(内核数量、可用 RAM 等)?

数据/操作的类型是否影响计数?

我的第一个猜测是在一般情况下设置为dop等于Environment.ProcessorCount,但我的直觉告诉我这可能无关。

usr*_*usr 4

硬件和执行的操作都很重要。

如果您想要运行不受任何其他方式限制的 CPU 密集型工作,则根本不需要使用方法。你最好使用为此而设计的Parallelor (并且在 IO 上非常糟糕)。PLINQ

对于 IO 来说,没有简单的方法来预测最佳 DOP。例如,像 DOP 1 这样的磁盘。像 4-16(?)这样的 SSD。Web 服务几乎可以接受任何价值。我还可以继续列出更多因素,包括数据库、锁争用等。

您需要在测试环境中测试不同的量。然后,使用最佳性能值。

使用Environment.ProcessorCountIO 没有任何意义。添加 CPU 后,IO 并不会变得更快。