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

在foreach循环中使用parallel.foreach和task有什么性能差异?分享

时间:2023-04-11 01:07:05 C#

在foreach循环中使用parallel.foreach和task有什么性能区别?我想知道执行此操作的最佳方法是什么,或者是否有任何文档/文章可以帮助我弄清楚在每个循环的正常情况下使用Parallel.foreach和Task之间的区别,如下所示:1-Parallel.foreach:Parallel.foreach{//做一些线程安全的事情:解析一个xml,然后通过存储方法将//保存到数据库服务器中}案例2-foreach中的任务:foreach{Taskt1=Task.factory.foreach或parallel.for,如果我们想在循环中并行运行怎么办?首先,关于该主题的最佳文档是CLR的第V部分,通过C#。其次,我希望Parallel.Foreach工作得更好,因为它不是只创建任务,它们也可以分组。在JeffreyRichter的书中,他解释说,单独启动的任务将放在一个线程池队列中。锁定实际的线程池队列会产生一些开销。为了解决这个问题,任务本身有自己的队列来创建它们的任务。这个任务持有的任务子队列实际上可以在不加锁的情况下做一些工作!我将不得不再次阅读该章(第27章),所以我不确定Parallel.Foreach是否有效,但这是我期望的。他解释说,锁定是昂贵的,因为它需要访问内核级结构。无论哪种情况,都不要指望它们会按顺序处理。由于前面提到的内部原因,使用Parallel.Foreach比使用foreach关键字更不可能顺序处理。Parallel.ForEach()所做的是创建少量任务来处理循环迭代。任务相对便宜,但它们不是免费的,因此这往往会提高性能。循环体执行得很快,改进是巨大的。这是对您所观察到的行为最可能的解释。您正在运行多少个任务?如果循环次数过多,那么创建新任务可能会花费很多时间。即第一个块运行15ms,第二个块运行1秒,第二个块甚至不运行任务。取消注释Start,时间会增加到将近3秒。WaitAll仅添加少量。以上是C#学习教程:在foreach循环中使用parallel.foreach和task有什么性能差异?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注—staticclassProgram{staticvoidMain(){constintmax=3000000;varrange=Enumerable.Range(0,max).ToArray();{varsw=new秒表();sw.开始();Parallel.ForEach(范围,i=>{});sw.停止();Console.WriteLine(sw.ElapsedMilliseconds);}{vartasks=newTask[max];varsw=new秒表();sw.开始();foreach(variinrange){tasks[i]=newTask(()=>{});//任务[i].开始();}//Task.WaitAll(任务);sw.停止();Console.WriteLine(sw.ElapsedMilliseconds);}}}本文收集自网络,不代表立场。侵权请点击右侧联系管理员删除。如需转载请注明出处: