.NET中的简单的并行循环Parallel.For和Parallel.ForEach
这里简单的介绍一下.net中的任务并行库。简单的并行循环Parallel.For和Parallel.ForEach。我们常见的for和foreach循环分别对应并行循环Parallel.For和Parallel.ForEach。
参考文档:https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.parallel_methods(v=vs.110).aspx
对比for循环和Parallel.For的性能
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Start();
int[] nums=new int[100];
for (int j = 0; j < 100; j++)
{
nums[j] = j * 100000 + j;
}
Debug.WriteLine(string.Format("循环开始:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
for (int i = 0; i < nums.Length; i++)
{
LoopRun(nums[i]);
}
//Parallel.For(0, nums.Length, i=>LoopRun(nums[i]));
Debug.WriteLine(string.Format("循环结束:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
Console.ReadKey(); //暂停
}
static void LoopRun(int num)
{
for (int i = 0; i < num; i++)
{
if (i == num - 1)
;//Debug.WriteLine("循环" + num);
}
}
执行代码,得到使用for循环从0到100的执行时间为:1845ms
循环开始: 0ms
循环结束:1,845ms
取消Parallel.For的注释代码,注释for循环,看看Parallel.For的执行时间为494ms
循环开始: 0ms
循环结束: 494ms
可以看到这个并行执行的效率是非常高的对比foreach循环和Parallel.ForEach
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Start();
int[] nums = new int[100];
for (int j = 0; j < 100; j++)
{
nums[j] = j * 100000 + j;
}
Debug.WriteLine(string.Format("循环开始:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
foreach (var item in nums)
{
LoopRun(item);
}
//Parallel.ForEach(nums, i => LoopRun(i));
Debug.WriteLine(string.Format("循环结束:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
Console.ReadKey(); //暂停
}
static void LoopRun(int num)
{
for (int i = 0; i < num; i++)
{
if (i == num - 1)
;//Debug.WriteLine("循环" + num);
}
}
执行代码,得到使用foreach循环从0到100的执行时间为:1832ms循环开始: 0ms
循环结束:1,832ms
取消Parallel.ForEach的注释代码,注释foreach循环,看看Parallel.ForEach的执行时间为394ms
循环开始: 0ms
循环结束: 394ms
可以看到这个并行执行的效率是非常高的,貌似比for循环和Parallel.For都要高