异步函数的不同运行时间

异步函数foo被调用 4 次,每次我们用.Result等待结果。


using System;

using System.Threading.Tasks;

using System.Diagnostics;


public class Program

{

    public static void Main(string[] args)

    {

        Stopwatch sm = new Stopwatch();


        sm.Start();

        var result1 = foo().Result;

        sm.Stop();

        Console.WriteLine("duration 1 : " + sm.Elapsed.ToString());


        sm.Reset();

        sm.Start();

        var result2 = foo().Result;

        sm.Stop();

        Console.WriteLine("duration 2 : " + sm.Elapsed.ToString());


        sm.Reset();

        sm.Start();

        var result3 = foo().Result;

        sm.Stop();

        Console.WriteLine("duration 3 : " + sm.Elapsed.ToString());


        sm.Reset();

        sm.Start();

        var result4 = foo().Result;

        sm.Stop();

        Console.WriteLine("duration 4 : " + sm.Elapsed.ToString());

    }


    public static async Task<int> foo()

    {

        await Task.Run(() =>

        {

            var x = 0;

            for (int i = 0; i < 100; i++)

            {

                x++;

            }

        });

        return 42;

    }

}

第一次通话比其他通话花费更多时间,例如:


持续时间 1:00:00:00.0016609

持续时间 2:00:00:00.0001197

持续时间 3 : 00:00:00.0001045

持续时间 4 : 00:00:00.0000632

在最后一次调用之后调用另一个异步函数(例如与 foo 具有相同主体的函数 bar)将比第四次调用 foo 花费更多的时间。是什么原因?


幕布斯7119047
浏览 132回答 1
1回答

慕码人2483693

正如评论中提到的,当您第一次调用foo它时,它由即时编译器编译为本机代码,其他调用执行预编译的代码,这就是它们工作得更快的原因。
打开App,查看更多内容
随时随地看视频慕课网APP