I am working on some performance optimization of the application therefore started working to make parallel call. But have seen lot of discrepancy in data processing, its fully inconsistent which request will gets rejected (failed). Here below sample code and its result in 4 round of the testing.
Trying to make 50 parallel API call and each time some of the request getting failed. Each time you can some of the request getting dropped by Parallel.ForEach
and Task
Parallel Processing Analysis on 50 sample API Call
Round-1
Time taken by Parallel.Foreach :00:00:00.2732286 - Count:50
Time taken by Task :00:00:00.0025059 - Count:48
Time taken by Foreach :00:00:08.3770130 - Count:50
Round-2
Time taken by Parallel.Foreach :00:00:00.1271151 - Count:46
Time taken by Task :00:00:00.0005574 - Count:50
Time taken by Foreach :00:00:05.3288707 - Count:50
Round-3
Time taken by Parallel.Foreach :00:00:00.1224027 - Count:49
Time taken by Task :00:00:00.0003799 - Count:50
Time taken by Foreach :00:00:05.2718811 - Count:50
Round-4
Time taken by Parallel.Foreach :00:00:00.1295570 - Count:49
Time taken by Task :00:00:00.0004238 - Count:48
Time taken by Foreach :00:00:05.2395539 - Count:50
C# sample Code
async static Task Main(string[] args)
{
HttpClient httpClient = new HttpClient();
var res1 = new List<HttpResponseMessage>();
var res2 = new List<HttpResponseMessage>();
var res3 = new List<HttpResponseMessage>();
var countlist = new List<int>();
for (int i = 1; i <= 50; i++)
{
countlist.Add(i);
}
// Parallel foreach
Stopwatch stopwatch1 = Stopwatch.StartNew();
Parallel.ForEach(countlist, async (item) =>
{
var data = await httpClient.GetAsync("https://jsonplaceholder.typicode.com/todos/1");
res1.Add(data);
});
stopwatch1.Stop();
// Task parallel
Stopwatch stopwatch2 = Stopwatch.StartNew();
var listtask = new List<Task>();
foreach (var item in countlist)
{
listtask.Add(Task.Run(async () =>
{
var data = await httpClient.GetAsync("https://jsonplaceholder.typicode.com/todos/1");
res2.Add(data);
}));
}
stopwatch2.Stop();
// Normal foreach
Stopwatch stopwatch3 = Stopwatch.StartNew();
foreach (var item in countlist)
{
var data = await httpClient.GetAsync("https://jsonplaceholder.typicode.com/todos/1");
res3.Add(data);
}
stopwatch3.Stop();
Console.WriteLine($"Time taken by Parallel.Foreach :{stopwatch1.Elapsed} - Count:{res1.Count}");
Console.WriteLine($"Time taken by Task :{stopwatch2.Elapsed} - Count:{res2.Count}");
Console.WriteLine($"Time taken by Foreach :{stopwatch3.Elapsed} - Count:{res3.Count}");
}
Any help or suggestion would be appreciated, I wanted to use Task
based parallel calls since its gives best performance in all