【发布时间】:2020-04-21 05:27:21
【问题描述】:
我正在努力寻找方法来进一步提高我的控制台应用程序的性能(已经完全正常工作)。
我有一个 CSV 文件,其中包含地址列表(大约 100k)。 我需要查询一个 Web API,其 POST 响应将是这些地址的地理坐标。然后我将用地理坐标(纬度和经度)丰富的地址数据将 GeoJSON 文件写入文件系统。
我当前的解决方案将数据拆分为 1000 条记录的批次,并使用 HttpClient(带有控制台应用程序的 .NET core 3.1 和使用 .NET Standard 2.0 的类库)向 Web API 发送异步 POST 请求。 GeoJSON 是我的 DTO 类。
public class GeoJSON
{
public string Locality { get; set; }
public string Street { get; set; }
public string StreetNumber { get; set; }
public string ZIP { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }
}
public static async Task<List<GeoJSON>> GetAddressesInParallel(List<GeoJSON> geos)
{
//calculating number of batches based on my batchsize (1000)
int numberOfBatches = (int)Math.Ceiling((double)geos.Count() / batchSize);
for (int i = 0; i < numberOfBatches; i++)
{
var currentIds = geos.Skip(i * batchSize).Take(batchSize);
var tasks = currentIds.Select(id => SendPOSTAsync(id));
geoJSONs.AddRange(await Task.WhenAll(tasks));
}
return geoJSONs;
}
我的异步 POST 方法如下所示:
public static async Task<GeoJSON> SendPOSTAsync(GeoJSON geo)
{
string payload = JsonConvert.SerializeObject(geo);
HttpContent c = new StringContent(payload, Encoding.UTF8, "application/json");
using HttpResponseMessage response = await client.PostAsync(URL, c).ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
var address = JsonConvert.DeserializeObject<GeoJSON>(await response.Content.ReadAsStringAsync());
geo.Latitude = address.Latitude;
geo.Longitude = address.Longitude;
}
return geo;
}
Web API 作为自托管 x86 应用程序在我的本地计算机上运行。 整个应用程序在不到 30 秒内结束。 最耗时的部分是 Async POST 部分(大约 25 秒)。 Web API 每篇文章只需要一个地址,否则我会在一个请求中发送多个地址。
关于如何提高针对 Web API 的请求性能的任何想法?
【问题讨论】:
-
ericlippert.com/2012/12/17/performance-rant 很好地了解了 Eric Lippert 的性能。
-
“最耗时的部分是异步 POST 部分” - 是的,所以外部服务器可能会限制你...
-
1000 个并发请求听起来太多了。您是否尝试过使用较小的数字?
-
@TheodorZoulias 我从 100 开始,并在测试期间上升。 1000 似乎返回了最好的结果。对于 100 个并发请求,应用平均比 100 个多花费约 6 秒。
标签: c# performance asynchronous post request