为什么任务并行性不会加速上传/下载?
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,尤其是云提供商)
我编写了一个简单的 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,尤其是云提供商)