Я использую Task Parallel Library (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?