Рассмотрим следующие два метода C #.Несмотря на функциональную эквивалентность, первая из них, по-видимому, лучше работает, как это предусмотрено соответствующими инструкциями по IL.
Быстрее:
static Task<string> Proxy(string text)
{
return Foo(text);
}
![enter image description here](https://i.stack.imgur.com/6dMjF.png)
Медленнее:
static async Task<string> ProxyAsync(string text)
{
return await Foo(text);
}
![enter image description here](https://i.stack.imgur.com/s7FQT.png)
Из моего понимания компилятор под капотом заменяет awaitинструкции со сложным конечным автоматом.
Почему компилятор не может автоматически оптимизировать подобные тривиальные случаи? Это похоже на низко висящий фрукт с большим эффектом.
Кроме того, каковы (не) преимущества выполнения таких оптимизаций вручную в коде C # (т.е. намеренное предпочтение более быстрой реализации по сравнению с более медленной).