预期产出是多少?

问题描述 投票:0回答:1

(对我来说)意外的输出。

代码是:

public  static async Task Main()
{
    Stopwatch  stopwatch = new Stopwatch();
    stopwatch.Start();

    for (int i=0; i<1000; i++)            
        await Task.Delay(1);
    
    stopwatch.Stop();

    Console.WriteLine(stopwatch.ElapsedMilliseconds);                       
}

我最好的理解是输出应该接近1000。实际情况不同。有人能解释一下为什么吗?

谢谢

c# async-await
1个回答
0
投票

如果您问为什么

Console.WriteLine(stopwatch.ElapsedMilliseconds)
不接近 1000,简短的回答是创建异步操作会产生开销。

在我的计算机上,运行您的代码会给出:

1160

我想你的意思不是

close to 1000

但是如果你这样做而不是循环:

await Task.Delay(1000);

在我的电脑上输出:

1003

有关异步操作性能的详细信息,有一篇很好的文章对此进行了解释: https://softwareengineering.stackexchange.com/questions/423005/measuring-async-await-overhead

假设 < 0.1ms overhead still true today. For easier calculation let's take 0.1ms to create an async task = 1000*0.1ms = 100ms. Which is close to my result of

1160
与您的代码。

可以在此处

找到有关异步性能的更深入的文章
© www.soinside.com 2019 - 2024. All rights reserved.