I was wondering how to optimize the performance of async/await codes with TPL(Task Parallel Library).
Therefore, I tested different amount of tasks(10/1000/5000) separately, and each task took 5 seconds.
- The result :
Without TPL | With TPL | |
---|---|---|
100 tasks | 500 sec | 27.91 sec (MaxDegreeOfParallelism = 20) |
1000 tasks | 5000 sec | 135.34 sec (MaxDegreeOfParallelism = 70) |
5000 tasks | 25000 sec | 317.33 sec (MaxDegreeOfParallelism = 130) |
- The testing code :
public async Task GetTasks() { try { Stopwatch sw = new Stopwatch(); // start sw.Start(); var workBlock = new ActionBlock<int>((a) => GetTask(a), new ExecutionDataflowBlockOptions { //Gets the maximum number of messages that may be processed by the block concurrently(from MSDN) MaxDegreeOfParallelism = 5 }); // 100 tasks foreach(var taskIndex in Enumerable.Range(1, 100)) { workBlock.Post(taskIndex); } workBlock.Complete(); await workBlock.Completion; // stop sw.Stop(); Console.WriteLine($"{sw.ElapsedMilliseconds}ms"); } catch { throw; } } public async Task GetTask(int a) { // mock http request await Task.Delay(5000); }
Thank you!
Top comments (1)
Here's another great post by @cgillum to discuss about the similar topic.