【发布时间】:2011-10-06 09:38:37
【问题描述】:
我正在使用任务并行库 (TPL) 来计算斐波那契数。 程序如下:
public static int Fib(int n)
{
if (n <= 1)
{
return n;
}
Task<int> task = Task.Factory.StartNew<int>(() => Fib(n - 1));
var p = Fib(n - 2);
return task.Result + p;
}
public static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("Answer: " + Fib(44));
watch.Stop();
Console.WriteLine("Time: " + watch.ElapsedMilliseconds);
}
}
很遗憾,这个程序需要很长时间才能完成。 但是这个程序的串行版本(如下所示)需要不到 30 秒 计算第 44 个斐波那契数。
public class FibTester
{
public static int Fib(int n)
{
if (n <= 1)
{
return n;
}
var q = Fib(n - 1);
var p = Fib(n - 2);
return p + q;
}
public static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("Answer: " + Fib(44));
watch.Stop();
Console.WriteLine("Time: " + watch.ElapsedMilliseconds);
}
}
我认为并行版本的问题是,它为每个 Fib(n - 1) 创建一个线程
要求。有什么方法可以控制在 TPL 中创建的线程数?
【问题讨论】:
-
您是否考虑过使用迭代方法?
-
我认为很明显斐波那契不能并行化,除非你提前知道一些相邻的斐波那契数对。
-
是的,一般我想知道如何限制TPL创建的线程数。
-
为什么要使用指数运行时算法,然后向其抛出多线程,而不是使用简单的快速算法?
-
我相信问题本身是超线性的。所以无论如何你都会得到一个序列。
标签: c# task-parallel-library fibonacci