Асинхронная функция фу вызывается 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;
}
}
Первый вызов занимает больше времени, чем остальные, например:
Вызов другой асинхронной функции после последнего вызова (например, панели функций с тем же телом, что и foo) займет больше времени, чем четвертый вызов foo. Какова причина?
Как упоминалось в комментариях, при первом вызове foo
он компилируется в собственный код компилятором Just-in-time, другие вызовы выполняют предварительно скомпилированный код, поэтому они работают быстрее.
Ну, во-первых, JIT-компилятор должен выполнять свою работу.