Вот неудачный тест. Как я могу убедиться, что циклы выполняются правильное количество раз?
public Random Randomator { get; set; }
public const int TimesToRun = 1000000;
[TestMethod]
public void ThrowTheDice()
{
Randomator = new Random();
var resultsParallel = new Dictionary<int, int>
{
{1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}
};
var resultsParallelForEach = new Dictionary<int, int>
{
{1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}
};
var stopwatch = new Stopwatch();
stopwatch.Start();
Parallel.For(0, TimesToRun, ctr =>
{
var val = ThrowDice();
if (!resultsParallel.ContainsKey(val))
throw new ArgumentOutOfRangeException();
var existing = resultsParallel[val];
resultsParallel[val] = existing + 1;
});
stopwatch.Stop();
var parallelTime = stopwatch.Elapsed;
stopwatch = new Stopwatch();
stopwatch.Start();
var numbers = Enumerable.Range(0, TimesToRun);
Parallel.ForEach(numbers, ctr =>
{
var val = ThrowDice();
if (!resultsParallel.ContainsKey(val))
throw new ArgumentOutOfRangeException();
var existing = resultsParallelForEach[val];
resultsParallelForEach[val] = existing + 1;
});
stopwatch.Stop();
var parallelForEachTime = stopwatch.Elapsed;
var parallelTotal = resultsParallel.Sum(x => x.Value);
var parallelForEachTotal = resultsParallelForEach.Sum(x => x.Value);
Assert.AreEqual(parallelTotal, TimesToRun);
Assert.AreEqual(parallelForEachTotal, TimesToRun);
}
public int ThrowDice()
{
return Randomator.Next(1, 7);
}
How can I confirm that the loops run the correct number of times?
Они запускаются правильное количество раз, но вы получаете неконтролируемый доступ к общему объекту. - person L.B   schedule 12.02.2014