为什么任务并行性不会加速上传/下载?

Why would Task parallelism not speed up uploads / downloads?

我编写了一个简单的 C# 控制台应用程序来测量顺序和并行下载 20 个 Azure blob 文件(每个图像大约 3mb)的速度。

我的印象是并行下载文件会快得多,但根据我的经验,它实际上需要更长的时间。这是并行下载的代码:

    List<Task> tasks = new List<Task>();
    foreach (string blobName in blobNames)
    {
        Task t = Task.Run(() =>
        {
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
            blockBlob.DownloadToFileAsync(blobName, FileMode.Create).Wait();
        });

        tasks.Add(t);
    }

    Task.WaitAll(tasks.ToArray());

我是不是处理错了,造成了不必要的瓶颈之类的?还是我从根本上误解了并行的好处?

IMO,您不应该启动新任务来下载每个 blob,因为这是 I/O 密集型操作,而不是计算密集型操作。 使用多个任务会增加管理任务的开销,而您实际上什么也得不到。

将您的代码更改为:

List<Task> tasks = new List<Task>();
foreach (string blobName in blobNames)
{
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
    tasks.Add(blockBlob.DownloadToFileAsync(blobName, FileMode.Create));
}


Task.WaitAll(tasks.ToArray());

这将启动多个异步 I/O 请求,一旦所有 blob 从 Azure blob 存储下载完毕,您的代码将继续。 由于我们没有单独等待每个下载任务,因此所有下载 运行 同时进行。

I was under the impression that parallel downloading files would be significantly faster, but in my experience it actually takes a little bit longer. Here is the code for the parallel downloads:

IO 操作的性能取决于很多因素。

如果并非所有节点都已达到最大性能,则只能通过使用并行化来加速。

例如,如果满足以下条件之一,您将不会受益,并且整体性能可能会因开销而下降:

专供下载:

  • 您正在达到 download/upload 网络、局域网或互联网、广域网的容量
  • 您正在达到最大处理能力(磁盘、内存等)
  • 您正在达到远程服务器的最大上传容量(注意:可以绑定 IP,尤其是云提供商)