C# 异步API在.Net本机编译后速度较慢
我们创建了一个项目,它返回在单个线程和多个线程上完成大量异步任务所花费的平均时间。这些任务大部分是空的,只是使用await Task.Yield()在同一线程上造成上下文中断。目的是评估任务调度器的性能 我们编译了相同的代码,使用.Net Native和不使用.Net Native。我们发现的结果非常惊人。对于.Net本机,同样的代码在手机上的性能下降了200%,在桌面应用上的性能下降了25%左右 详细结果(越低越好):C# 异步API在.Net本机编译后速度较慢,c#,windows-store-apps,win-universal-app,.net-native,C#,Windows Store Apps,Win Universal App,.net Native,我们创建了一个项目,它返回在单个线程和多个线程上完成大量异步任务所花费的平均时间。这些任务大部分是空的,只是使用await Task.Yield()在同一线程上造成上下文中断。目的是评估任务调度器的性能 我们编译了相同的代码,使用.Net Native和不使用.Net Native。我们发现的结果非常惊人。对于.Net本机,同样的代码在手机上的性能下降了200%,在桌面应用上的性能下降了25%左右 详细结果(越低越好): for (int i = 0; i < count; i++)
for (int i = 0; i < count; i++)
{
Task.Run(() => ProcessTaskDesktop());
}
public async void ProcessTaskDesktop()
{
await Task.Yield();
.
.
//logic to do iterations and check code end
.
.
}
在手机上:
计划20000个异步任务并计算所用时间。我们运行了10次此测试,以获得执行此任务所需的平均时间
单线程(秒):
for (int i = 0; i < count; i++)
{
Task.Run(() => ProcessTaskDesktop());
}
public async void ProcessTaskDesktop()
{
await Task.Yield();
.
.
//logic to do iterations and check code end
.
.
}
托管代码(无.Net本机编译)
3.02
.Net本机编译代码
9.06
多线程(秒):
for (int i = 0; i < count; i++)
{
Task.Run(() => ProcessTaskDesktop());
}
public async void ProcessTaskDesktop()
{
await Task.Yield();
.
.
//logic to do iterations and check code end
.
.
}
托管代码(无.Net本机编译)
0.10
.Net本机编译代码
0.29
在桌面上:
for (int i = 0; i < count; i++)
{
Task.Run(() => ProcessTaskDesktop());
}
public async void ProcessTaskDesktop()
{
await Task.Yield();
.
.
//logic to do iterations and check code end
.
.
}
计划80000个异步任务并计算所用时间。我们运行了10次此测试,以获得执行此任务所需的平均时间
单线程(秒):
for (int i = 0; i < count; i++)
{
Task.Run(() => ProcessTaskDesktop());
}
public async void ProcessTaskDesktop()
{
await Task.Yield();
.
.
//logic to do iterations and check code end
.
.
}
托管代码(无.Net本机编译)
9.15
.Net本机编译代码
11.394
多线程(秒):
for (int i = 0; i < count; i++)
{
Task.Run(() => ProcessTaskDesktop());
}
public async void ProcessTaskDesktop()
{
await Task.Yield();
.
.
//logic to do iterations and check code end
.
.
}
托管代码(无.Net本机编译)
0.0937
.Net本机编译代码
0.177
我们的应用程序大量使用异步API,并且在.Net本机编译后性能明显下降。这些数字似乎可以解释退化的原因,除非我们遗漏了什么。是否还有其他人面临类似问题,如果有,是否有解决办法
代码片段:
for (int i = 0; i < count; i++)
{
Task.Run(() => ProcessTaskDesktop());
}
public async void ProcessTaskDesktop()
{
await Task.Yield();
.
.
//logic to do iterations and check code end
.
.
}
for(int i=0;iProcessTaskDesktop());
}
公共异步void ProcessTaskDesktop()
{
等待任务;
.
.
//执行迭代和检查代码结束的逻辑
.
.
}
有些关联。你好!我是.NET本地团队的Matt。我回复了你的邮件,我们很快会调查的。太棒了,它也在这里,所以其他人可以跟随。如果有人同时发现了这种情况,请告诉我们!