【问题标题】:Specifing default MaxDegreeOfParallelism cause the parallel loop to run faster指定默认 MaxDegreeOfParallelism 会导致并行循环运行得更快
【发布时间】:2017-02-07 16:01:27
【问题描述】:

我正在使用 System.Threading.Tasks.Parallel.ForEach()。 出于某种原因,将 MaxDegreeOfParallelism 设置为“-1”甚至“50”,会导致循环运行得更快(大约 15 秒并且它是一致的)。 MaxDegreeOfParallelism 参数的默认值为 -1,将其设置为 50 或任何其他数字只会使其变慢。 可能是什么原因?

System.Collections.Concurrent.ConcurrentBag<FileDataInfo> filesData = new System.Collections.Concurrent.ConcurrentBag<FileDataInfo>();
        System.Threading.Tasks.Parallel.ForEach(filesInfo, 
            new System.Threading.Tasks.ParallelOptions() { MaxDegreeOfParallelism = -1 },
            info =>
        {
            if (!string.IsNullOrEmpty(info.FolderPath))
                info.FolderPath = System.IO.Path.Combine(dataPathDirName, info.FolderPath);
            else
                info.FolderPath = dataPathDirName;

            var storageHandler = FileStorageFactory.CreateStorageHander();
            byte[] data = storageHandler.GetFileData(info.FilePath);
            filesData.Add(new FileDataInfo() { Info = info, Data = data });
        });

【问题讨论】:

  • 你的最后一句话和你的第一句话相反。
  • 你能改写你的问题吗?一句话说快,下一句说慢。你在问什么?
  • 我在您的代码中没有看到昂贵的任务。并行化任务只适用于昂贵的任务,如果你尝试并行化大量的小任务,它可能会对你的性能产生负面影响(或者你可能只会得到一点提升,这不值得你的代码引入复杂性)。
  • @M.kazem Akhgary GetFileData() 是一项昂贵的任务
  • GetFileData 听起来像是 I/O 主导的任务。 Parallel.ForEach 不是一个好的选择 - 它是为 CPU 主导的任务而设计的,理想情况下完全没有 I/O。

标签: c# task-parallel-library parallel.foreach


【解决方案1】:

您的问题不是 CPU 限制的,而是 I/O 限制的。现代驱动器可以利用大量 I/O 队列来更有效地执行它。通过使用Parallel.ForEach,您可以填充此队列并使驱动器以最高效率运行。

虽然您可能会注意到此处的加速,但请注意您正在创建大量线程来完成此操作。过多的线程几乎从来都不是一个好主意,因为由于调度程序开销和缓存流失,它变得非常低效。如果可能,我建议将代码转换为使用异步和 TPL 数据流。这将允许您使用单个线程来管理大量并行 I/O 请求。

【讨论】:

    【解决方案2】:

    MaxDegreeOfParallelism 告诉 TPL 可以同时运行多少东西。这会以多种方式影响执行速度。通过将此值设置为较低的值,它允许任务在它们自己的 CPU/Core 上运行。这使事情运行得更快,因为您获得了良好的并行性。如果您将此值设置得更高(或设置为 -1),那么您可以运行比 CPU/核心更多的任务。发生这种情况时,跨任务共享 CPU 所花费的时间可能会花费大量时间,并使操作看起来更慢。

    一般经验法则:不要将并行度设置为高于系统中的内核/CPU 数量。

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2021-07-07
      • 2020-12-20
      • 1970-01-01
      相关资源
      最近更新 更多