考虑以下两种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#代码中手动进行此类优化的(缺点)有哪些(即,有意偏向于较快的实现而不是较慢的实现)。
为什么C#编译器无法优化简单的异步/等待方法
因为每个功能(包括优化)的起点都为负100点。如果语义不同(在这种情况下它们是不同的),则尤其如此。
区别是细微的,但是如果定义Foo为:
Task Foo(string text)
{
throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)
随后的行为Proxy和ProxyAsync不同。Proxy将异常直接传播给调用者;ProxyAsync会捕获该异常并将其放置在从Task返回的异常中ProxyAsync。
我有一篇博客文章更详细地阐述了选择和选择时的思想asyncawait。
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |