Различное время выполнения асинхронной функции

Асинхронная функция фу вызывается 4 раза, и каждый раз мы ждем результата с .Результат.

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) займет больше времени, чем четвертый вызов foo. Какова причина?

Ну, во-первых, JIT-компилятор должен выполнять свою работу.

stuartd 13.09.2018 18:33
0
1
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминалось в комментариях, при первом вызове foo он компилируется в собственный код компилятором Just-in-time, другие вызовы выполняют предварительно скомпилированный код, поэтому они работают быстрее.

Другие вопросы по теме