当前位置: 首页 > 编程语言 > C#

并行斐波那契数计算器分享

时间:2023-04-10 15:50:57 C#

并行斐波那契数计算器我正在使用TaskParallelLibrary(TPL)来计算斐波那契数。计划如下:publicstaticintFib(intn){if(n<=1){returnn;}任务task=Task.Factory.StartNew(()=>Fib(n-1));varp=Fib(n-2);返回任务.Result+p;}publicstaticvoidMain(string[]args){秒表watch=newStopwatch();观看。开始();Console.WriteLine("答案:"+Fib(44));观看。停止();Console.WriteLine("时间:"+watch.ElapsedMilliseconds);}}不幸的是,这个程序需要很长时间才能完成。但是这个程序的顺序版本(如下所示)计算第44个斐波那契数只用了不到30秒。公共类FibTester{publicstaticintFib(intn){如果(n<=1){返回n;}varq=Fib(n-1);varp=Fib(n-2);返回p+q;}publicstaticvoidMain(string[]args){秒表watch=newStopwatch();观看。开始();Console.WriteLine("答案:"+Fib(44));观看。停止();Console.WriteLine("时间:"+watch.ElapsedMilliseconds);我认为并行版本的问题在于它为每个Fib(n-1)请求创建一个线程。有没有办法控制在TPL中创建的线程数?这是如何不使用多线程的完美示例!您正在为递归函数的每次迭代创建一个新任务。因此每个任务都会创建一个新任务,等待该任务完成,然后从结果中添加数字。每个线程都有两个工作:1-创建新线程,2-添加两个数字。创建每个线程的开销成本远远超过将两个数字相加的成本。要回答有关限制创建线程数的问题,TPL使用ThreadPool。您可以使用ThreadPool.SetMaxThreads限制线程数。我认为很明显斐波那契无法并行化,除非您提前知道一些相邻的斐波那契数,然后去查找迭代代码。无论您做什么,都不要在每次迭代/递归时生成任务/线程!开销会降低性能。即使应用了并行化,这也是一个很大的反模式。只是为了好玩:)使用系统;使用System.Linq;使用System.Threading.Tasks;公共类程序{staticreadonlydoublesqrt5=Math.Sqrt(5);静态只读双p1=(1+sqrt5)/2;静态只读双p2=-1*(p1-1);staticulongFib1(intn)//比Fib2稍微慢一点{doublen1=Math.Pow(p1,n+1);双n2=Math.Pow(p2,n+1);返回(ulong)((n1-n2)/sqrt5);}staticulongFib2(intn)//比Fib3快40倍{doublen1=1.0;双n2=1.0;对于(inti=0;i{n1*=p1;n2*=p2;});返回(ulong)((n1-n2)/sqrt5);}publicstaticvoidMain(string[]args){for(intj=0;j<100000;j++)for(inti=0;i<90;i++)Fib1(i);对于(inti=0;i<90;i++)Console.WriteLine(Fib1(i));}}你的程序非常有用,因为重复相同的计算(Fib(n-1)实际上重新计算所有数字foreach(varnbrinFibo().Take(5000)){Console.Write(nbr.ToString()+"");}sw.Stop();Console.WriteLine();Console.WriteLine("Ellipped:"+sw.Elapsed.ToString());控制台.ReadLine();}staticIEnumerableFibo(){longa=0;长b=1;长吨;while(true){t=a+b;收益回报t;一=b;b=t;}}}44thfoundat5ms代码中最慢的部分是循环中的Console.Write。以上就是C#学习教程:并行斐波那契数计算器分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: