你知道为什么同步斐波那契方法比异步/等待更快并且比异步任务更快吗?
我在每个项目方法上都使用了异步,所以主要是这是一个非常糟糕的方法......
Code:
static int FibonacciSync(int number)
{
if (number == 0) { return 0; }
else if (number == 1) { return 1; }
else
{
var t1 = FibonacciSync(number - 1);
var t2 = FibonacciSync(number - 2);
return t1 + t2;
}
}
async static Task<int> FibonacciAwait(int number)
{
if (number == 0)
{ return 0; }
else if (number == 1)
{ return 1; }
else
{
var task1 = FibonacciAwait(number - 1);
var task2 = FibonacciAwait(number - 2);
return (await task1) + (await task2);
}
}
static Task<int> FibonacciAsync(int number)
{
if (number == 0)
{ return Task.FromResult(0); }
else if (number == 1)
{ return Task.FromResult(1); }
else
{
return FibonacciAsync(number - 1).ContinueWith(task1 =>
{
return FibonacciAsync(number - 2).ContinueWith(task2 =>
{
return task1.Result + task2.Result;
});
}).Unwrap();
}
}
Result:
- 同步:00:00:00.0121900
- 等待:00:00:00.2118170
- 异步:00:00:02.6211660
你知道为什么同步斐波那契方法比异步/等待更快并且比异步任务更快吗?
异步并不是为了改进原始速度。正如您所发现的,总体上需要更长的时间。如果你使用不当,就像你所做的那样,它会让事情变得非常非常慢,效益为零。
这里的根本问题是你不明白异步的用途。异步用于管理延迟。一旦你内化了这个事实,你就会开始正确地使用它。
Latency是您之间的时间间隔request计算或副作用,并且当计算或副作用是complete.
例如,假设您正在计算的东西是计算成本极其昂贵。例如,您正在计算一个非常复杂的图形,即使您将整个核心专用于它,也将花费超过 30 毫秒的时间来计算。您不希望用户界面在进行计算时停止,因此您可以将计算放到另一个线程上,为该线程分配一个 CPU,然后等待结果。等待意味着“在等待高延迟操作完成时去寻找更多工作要做”.
例如,假设您正在做某事not计算成本较高,但需要等待外部资源。例如,您正在调用数据库,并且需要 30 多毫秒才能返回结果。在这种情况下你不想启动线程。该线程将休眠等待结果!相反,您想使用数据库访问 API 的异步版本,并且等待高延迟结果.
在您的示例中,您一开始就没有高延迟操作,因此等待它是没有意义的。您所做的只是为运行时创建大量工作来创建和管理工作队列,这是您付出代价但没有从中获得任何好处的工作。你的工作需要纳秒;仅对需要的作业使用异步毫秒或更长时间。
仅当您有高延迟操作时才使用异步。异步提高了性能,因为它在等待高延迟结果出现时释放了线程以继续工作。如果没有高延迟结果,那么异步只会减慢一切。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)