You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:29:10