【发布时间】:2012-01-22 02:02:01
【问题描述】:
当我尝试使用正常的 for 循环(这是正确的结果)与 Parallel For 时,我对我的一个简单模拟示例的不同结果感到有些惊讶。请帮我找出可能是什么原因。我观察到并行执行与正常相比非常快。
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Simulation
{
class Program
{
static void Main(string[] args)
{
ParalelSimulation(); // result is .757056
NormalSimulation(); // result is .508021 which is correct
Console.ReadLine();
}
static void ParalelSimulation()
{
DateTime startTime = DateTime.Now;
int trails = 1000000;
int numberofpeople = 23;
Random rnd = new Random();
int matches = 0;
Parallel.For(0, trails, i =>
{
var taken = new List<int>();
for (int k = 0; k < numberofpeople; k++)
{
var day = rnd.Next(1, 365);
if (taken.Contains(day))
{
matches += 1;
break;
}
taken.Add(day);
}
}
);
Console.WriteLine((Convert.ToDouble(matches) / trails).ToString());
TimeSpan ts = DateTime.Now.Subtract(startTime);
Console.WriteLine("Paralel Time Elapsed: {0} Seconds:MilliSeconds", ts.Seconds + ":" + ts.Milliseconds);
}
static void NormalSimulation()
{
DateTime startTime = DateTime.Now;
int trails = 1000000;
int numberofpeople = 23;
Random rnd = new Random();
int matches = 0;
for (int j = 0; j < trails; j++)
{
var taken = new List<int>();
for (int i = 0; i < numberofpeople; i++)
{
var day = rnd.Next(1, 365);
if (taken.Contains(day))
{
matches += 1;
break;
}
taken.Add(day);
}
}
Console.WriteLine((Convert.ToDouble(matches) / trails).ToString());
TimeSpan ts = DateTime.Now.Subtract(startTime);
Console.WriteLine(" Time Elapsed: {0} Seconds:MilliSeconds", ts.Seconds + ":" + ts.Milliseconds);
}
}
}
提前致谢
【问题讨论】:
标签: c# parallel-processing task-parallel-library