SaveChangesAsync性能优化未达预期?异步等待方式性能测试分析
逐个await vs Task.WhenAll()的性能对比测试
我最近专门做了一组测试,对比串行逐个await异步任务和并行使用Task.WhenAll()一次性等待所有任务的性能表现,测试结果和预期完全吻合,分享给大家参考:
测试结果
- 循环次数为100时:
- 循环内逐个await总耗时:11595ms
- Task.WhenAll()一次性等待总耗时:118ms
- 性能提升:后者比前者快约98倍
- 循环次数为1000时:
- 循环内逐个await总耗时:111249ms
- Task.WhenAll()一次性等待总耗时:189ms
- 性能提升:后者比前者快约588倍
这个结果其实很好理解:逐个await会让每个异步任务必须等待前一个完成后才会启动,本质是串行执行;而Task.WhenAll()是一次性启动所有任务,让它们并行执行,最后只等待全部完成,所以随着任务数量增多,性能差距会被放大。
测试代码(控制台应用)
public class TestSaveChanges { public async Task RunSequentialAwaitTest(int loopCount) { var stopwatch = System.Diagnostics.Stopwatch.StartNew(); for (int i = 0; i < loopCount; i++) { await PerformSampleAsyncOperation(); } stopwatch.Stop(); Console.WriteLine($"循环内逐个await耗时:{stopwatch.ElapsedMilliseconds}ms"); } public async Task RunWhenAllTest(int loopCount) { var stopwatch = System.Diagnostics.Stopwatch.StartNew(); var tasks = new List<Task>(); for (int i = 0; i < loopCount; i++) { tasks.Add(PerformSampleAsyncOperation()); } await Task.WhenAll(tasks); stopwatch.Stop(); Console.WriteLine($"await all耗时:{stopwatch.ElapsedMilliseconds}ms"); } // 模拟实际场景中的异步操作(比如DB保存、API调用等) private async Task PerformSampleAsyncOperation() { await Task.Delay(100); } }
内容的提问来源于stack exchange,提问作者Raskolnikov
相关产品推荐
相关产品推荐

