外贸企业网站管理系统,深圳市做物流网站,网站注册可以免费吗,天津建设工程信息平台还是那句话#xff1a;十年河东#xff0c;十年河西#xff0c;莫欺少年穷。 今天和大家探讨一个问题#xff1a;Parallel.For 和 For 谁的效率高呢#xff1f; 从CPU使用方面而言#xff0c;Parallel.For 属于多线程范畴#xff0c;可以开辟多个线程使用CPU内核#x…还是那句话十年河东十年河西莫欺少年穷。 今天和大家探讨一个问题Parallel.For 和 For 谁的效率高呢 从CPU使用方面而言Parallel.For 属于多线程范畴可以开辟多个线程使用CPU内核也就是说可以并行处理程序。For 循环是单线程的一个线程执行完所有循环。 因此你会认为多线程的效率肯定高于单线程。但这样认为是错误的 例如下面程序 static void Main(string[] args){Stopwatch sw new Stopwatch();sw.Start();ParallelLoopResult result Parallel.For(0, 10000, i {Console.Write();});sw.Stop();TimeSpan ts2 sw.Elapsed;Console.WriteLine(Parallel.For总共花费{0}ms., ts2.TotalMilliseconds);//Stopwatch sw_Eq new Stopwatch();sw_Eq.Start();for (int i 0; i 10000; i){Console.Write(); }sw_Eq.Stop();TimeSpan tssw_Eq sw_Eq.Elapsed;Console.WriteLine(for总共花费{0}ms., tssw_Eq.TotalMilliseconds);Console.ReadKey();} 额为什么For 循环要比Parallel.For 效率要高呢 这是因为循环体内执行的任务开销太小仅仅是输出一个空字符串而已。微软的文章已经指出任务的开销大小对并行任务的影响。如果任务很小那么由于并行管理的附加开销任务分配调度同步等成本可能并行执行并不是优化方案。这也是上述程序For效率高出的原因。 如果在循环体内执行向数据库插入操作那么Parallel.For 效率就会高出在此我们认为每向数据库插入一条记录花费1毫秒时间将程序修改如下 class Program{static void Main(string[] args){Stopwatch sw new Stopwatch();sw.Start();ParallelLoopResult result Parallel.For(0, 10, i {Console.Write();Thread.Sleep(1);});sw.Stop();TimeSpan ts2 sw.Elapsed;Console.WriteLine(Parallel.For总共花费{0}ms., ts2.TotalMilliseconds);//Stopwatch sw_Eq new Stopwatch();sw_Eq.Start();for (int i 0; i 10; i){Console.Write();Thread.Sleep(1);}sw_Eq.Stop();TimeSpan tssw_Eq sw_Eq.Elapsed;Console.WriteLine(for总共花费{0}ms., tssw_Eq.TotalMilliseconds);Console.ReadKey();}}
} 执行结果大大改变 相信到此大家应该明白了吧也就说For是同步Parallel.For 是异步执行。当然我们也可以使用Thread实现异步编程 代码如下 class Program{static void Main(string[] args){Console.WriteLine(主线程测试开始..);Thread th new Thread(ThMethod);th.Start();Thread.Sleep(1000);Console.WriteLine(主线程测试结束..);Console.ReadLine();}static void ThMethod(){Console.WriteLine(异步执行开始);for (int i 0; i 5; i){Console.WriteLine(异步执行 i.ToString() ..);Thread.Sleep(1000);}Console.WriteLine(异步执行完成);}} Parallel.ForEach 和 ForEach 与 Parallel.For 和 For 一样一个是异步执行开辟多个线程。一个是同步执行开辟一个线程。因此效率方面同上主要看执行的什么任务在此不作具体说明。 下面写了一些代码从下面的代码中我们可以看出Parallel.ForEach具体开辟了几个线程如下 class Program{static void Main(string[] args){int[] intList new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };ParallelLoopResult result Parallel.ForEach(intList, (s,pls,longs) {Console.WriteLine(longs s);pls.Stop();if (pls.IsStopped){Parallel.Invoke(Gs,Ks);//异步调用多个方法}});Console.ReadKey();}public static void Gs(){Console.WriteLine(异步方法1);}public static void Ks(){Console.WriteLine(异步方法2);}} 上述代码中调用了Stop()方法我们都知道如果是同步执行的调用Stop()后会立即停止执行那么程序只会输出索引值为0的结果。而在异步中不是这样的异步迭代是多线程且没有顺序的。其执行结果如下 多次执行的结果可能不同。 如上图所示第一个图开辟了三个线程执行顺序为 0 2 1第二个图开辟了两个线程执行顺序为1 0 下面的Invoke()方法是异步调用其他的方法在此不作解释可参考C# Invoke() 设置开启的线程的个数 Parallel.ForEach(NameArray,new ParallelOptions{MaxDegreeOfParallelism3},(item,pls,i){}); 陈卧龙的博客