c# - 确定 ForEachAsync 并行度的因素

标签 c# asynchronous async-await task-parallel-library parallel.foreachasync

下面是 ForEachAsync 的实现 written by Stephen Toub .

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); 
        })); 
}

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

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

数据/操作的类型会影响计数吗?

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

最佳答案

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

如果你想运行不受任何其他方式限制的 CPU 绑定(bind)工作,你根本不需要方法。您最好使用为此而设计的 ParallelPLINQ(并且在 IO 方面非常糟糕)。

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

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

使用 Environment.ProcessorCount 对 IO 毫无意义。添加 CPU 时,IO 不会变快。

关于c# - 确定 ForEachAsync 并行度的因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34359509/

相关文章:

c# - 从 catch Exception block 中使用 CancellationToken.Cancel() 是否有效?

c# - SpVoice 和 SpeechSynthesizer 有什么区别

c# - 如何冒泡我的 ViewModel 层次结构中的更改?

c# - 动态生成的 IL 中的值类型转换

python - 运行Go异步操作并写入map

Swift:减慢对 WebService 的多次调用

asp.net - 在 ASP.Net MVC 中禁用每个请求的 session 状态

c# - 获取取消 token 或公开取消方法?

javascript - 在不链接回调的情况下等待 getScript

一个列表中的 C# 不同类对象