为什么C#编译器无法优化简单的异步/等待方法

Duš*_*ský 0 c# async-await

考虑以下两种C#方法。尽管功能上等效,但第一个指令似乎表现更好,如相应的IL指令所建议。

快点:

static Task<string> Proxy(string text)
{
  return Foo(text);
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

慢点:

static async Task<string> ProxyAsync(string text)
{
  return await Foo(text);
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

据我了解,引擎盖下的编译器用复杂的状态机代替了等待指令。

为什么编译器无法自动优化这种琐碎的情况?
这似乎是影响力不大的低落果实。

同样,在C#代码中手动进行此类优化的(缺点)有哪些(即,有意偏向于较快的实现而不是较慢的实现)。

Ste*_*ary 9

为什么C#编译器无法优化简单的异步/等待方法

因为每个功能(包括优化)的起点都为负100点。如果语义不同(在这种情况下它们是不同的),则尤其如此。

区别是细微的,但是如果定义Foo为:

Task Foo(string text)
{
  throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)

随后的行为ProxyProxyAsync不同。Proxy将异常直接传播给调用者;ProxyAsync会捕获该异常并将其放置在从Task返回的异常中ProxyAsync

我有一篇博客文章更详细地阐述了选择和选择时的思想asyncawait