C# 使用Parallel并行开发Parallel.For、Parallel.Foreach实例

来源:互联网 发布:mmd舞蹈动作数据 编辑:程序博客网 时间:2024/04/30 11:27
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.Threading.Tasks;using System.Collections.Concurrent;namespace ConsoleApplication1{    class Program    {        /*         * 测试分析结果         * Parallel.For、Parallel.Foreach发挥出了平行运算的优势,将效率提高了接近一半左右。         *          * 测试总结         * 对于Parallel.For、Parallel.Foreach的使用应该要特别小心,         * 它们的优势是处理列表很长,且对列表内的元素进行很复杂的业务逻辑,且不会使用共享资源,         * 只针对自身的业务逻辑处理,方才能提升效率。         * 因为如果逻辑过于简单的话,创建线程的花费将大于业务执行的花费,得不偿失。                  */        static void Main(string[] args)        {            //产生测试资料            List<int> testData = new List<int>();            Random Rand = new Random();            //产生乱数列表            for (int i = 0; i < 1000000; i++)            {                testData.Add(Rand.Next(1000));            }            //打印正确结果            Console.WriteLine(testData.Sum());            for (int i = 0; i < 5; i++)            {                Console.WriteLine();                TestFor(testData);                TestParallelFor(testData);                TestParallelForeach(testData);            }            Console.ReadKey();        }        static void TestFor(List<int> testData)        {            DateTime time1 = DateTime.Now;            foreach (var item in testData)            {                item.ToString();            }            Console.WriteLine(string.Format("ForEach:     t{0} in {1}", testData.Sum(), (DateTime.Now - time1).TotalMilliseconds));        }        static void TestParallelFor(List<int> testData)        {            DateTime time1 = DateTime.Now;            Parallel.For(0, testData.Count, (i, loopState) =>            {                testData[i].ToString();            });            Console.WriteLine(string.Format("Parallel.For:   t{0} in {1}", testData.Sum(), (DateTime.Now - time1).TotalMilliseconds));        }        static void TestParallelForeach(List<int> testData)        {            //记录结果用            DateTime time1 = DateTime.Now;            ConcurrentStack<int> resultData = new ConcurrentStack<int>();            Parallel.ForEach(testData, (item, loopState) =>            {                item.ToString();            });            Console.WriteLine(string.Format("Parallel.ForEach:t{0} in {1}", testData.Sum(), (DateTime.Now - time1).TotalMilliseconds));        }    }}

0 0