概述
我希望提高一个程序向同一外部API端点发出多个HTTP请求的性能。因此,我创建了一个控制台应用程序来执行一些测试。方法GetPostAsync
发送异步HTTP请求到外部API,并将结果作为字符串返回。
private static async Task<string> GetPostAsync(int id)
{
var client = new HttpClient();
var response = await client.GetAsync($"https://jsonplaceholder.typicode.com/posts/{id}");
return await response.Content.ReadAsStringAsync();
}
另外,我已经实现了以下方法来比较多次调用 await
和 Task.WhenAll
的执行时间。
private static async Task TaskWhenAll(IEnumerable<int> postIds)
{
var tasks = postIds.Select(GetPostAsync);
await Task.WhenAll(tasks);
}
private static async Task MultipleAwait(IEnumerable<int> postIds)
{
foreach (var postId in postIds)
{
await GetPostAsync(postId);
}
}
测试结果
使用集成的Stopwatch
类,我测量了这两种方法的时间,有趣的是,使用Task.WhenAll
的方法比另一种方法表现得更好:
发出50个HTTP请求
- TaskWhenAll:约650毫秒
- MultipleAwait:约4500毫秒
为什么使用Task.WhenAll
方法会快很多,选择这种方法是否存在任何负面效应(例如异常处理)?
foreach
循环时,你会一个接一个地发送请求。这意味着每个请求必须等待前面的请求完成才能开始。而WhenAll
模式可以一次性发送所有请求,而不是一个接一个地发送。没有任何等待。可能的负面影响是,某些API可能有限制,如果一次性发送50个请求,你可能会达到这些限制。但这取决于外部API,而不是代码本身。 - Patrick Tucci