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

AsParallel究竟是如何工作的?

时间:2023-04-11 01:14:08 C#

AsParallel究竟是如何工作的?下面的测试程序似乎没有蹲下。这是因为我正在测试一个小列表吗?staticvoidMain(string[]args){列表list=0.UpTo(4);测试(列表。AsParallel());测试(列表);}privatestaticvoidTest(IEnumerableinput){vartimer=newStopwatch();定时器。开始();varsize=input.Count();if(input.Where(IsOdd).Count()!=size/2)thrownewException("计算赔率失败");定时器。停止();Console.WriteLine("测试"+size+"numbersin"+timer.Elapsed.TotalSeconds+"seconds");}privatestaticboolIsOdd(intn){Thread.Sleep(1000);返回n%2==1;}两个版本都需要4秒才能运行。任务并行库负责序列的静态类型化。对于要由TPL处理的操作,它应该是一个IParallelEnumerable。当您调用测试时,您正在将集合转换为IEnumerable。因此,编译器将resolve.Where在序列上调用System.Linq.Enumerable.Where扩展方法,而不是TPL提供的并行版本。(.NET4的更新,因为这个问题在Google搜索AsParallel()时排名很高)只需进行一些更改,您的示例就可以像我想象的那样工作。更改列表list=0.UpTo(4);到varlist=Enumerable.Range(0,4);如果您添加了带有ParallelQuery签名的函数重载,您的示例将起作用...privatestaticvoidTest(ParallelQueryinput){vartimer=newStopwatch();定时器。开始();intsize=input.Count();if(input.Where(IsOdd).Count()!=size/2){thrownewException("计算赔率失败");}定时器。停止();Console.WriteLine("测试"+size+"numbersin"+timer.Elapsed.TotalSeconds+"seconds");}或者,您可以使用LINQ语法....privatestaticvoidTest(ParallelQuerylist){vartimer=Stopwatch.StartNew();if((fromninlist.AsParallel()whereIsOdd(n)selectn).Count()!=(list.Count()/2)){thrownewException("计算概率失败");}Console.WriteLine("Tested"+list.Count()+"numbersin"+timer.Elapsed.TotalSeconds+"seconds");希望这对某人有帮助!Parallel通过将你的东西放入ThreadPool来工作。另外,你有多少核?如果您使用的是单核机器,它仍然需要大约4秒才能运行。以上是C#学习教程:AsParallel是如何工作的?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: