我们创建了一个项目,它返回在单个线程和多个线程上完成大量异步任务所需的平均时间。这些任务大多是空的,只是使用await Task.Yield()在同一个线程上导致上下文中断。目的是评估任务计划程序的性能。
我们使用.Net Native编译了相同的代码,没有它。我们发现的结果非常惊人。使用.Net Native相同的代码在手机上降低了200%的性能,在桌面应用程序上降低了大约25%。
详细结果(越低越好):
在手机上:
计划20,000个异步任务并计算所花费的时间。我们运行此测试10次以获得执行此任务所需的平均时间。
单线程(秒):
托管代码(没有.Net Native编译)
3.02
.Net Native编译代码
9.06
多线程(以秒为单位):
托管代码(没有.Net Native编译)
0.10
.Net Native编译代码
0.29
在桌面上:
计划80,000个异步任务并计算所花费的时间。我们运行此测试10次以获得执行此任务所需的平均时间。
单线程(秒):
托管代码(没有.Net Native编译)
9.15
.Net Native编译代码
11.394
多线程(以秒为单位):
托管代码(没有.Net Native编译)
0.0937
.Net Native编译代码
0.177
我们的应用程序使用异步API,并且在.Net Native编译后可见性能下降。这些数字似乎解释了退化,除非我们错过了什么。还有其他人遇到类似的问题,如果有,是否有解决方法?
代码段:
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
.
.
}